2011-03-17 14 views
5

Hay varias preguntas de paginación de servidor sql en stackoverflow y muchas de ellas hablan sobre usar ROW_NUMBER() OVER (ORDER BY ...) AND CTE. Una vez que ingresa en los cientos de miles de filas y comienza a agregar clasificaciones en valores de clave no primarios y agrega cláusulas WHERE personalizadas, estos métodos se vuelven muy ineficaces. Tengo un conjunto de datos de varios millones de filas que estoy tratando de buscar con clasificación y filtrado personalizados, pero obtengo un rendimiento deficiente, incluso con índices en todos los campos que selecciono y filtrado. Incluso llegué a incluir mis columnas SELECT en cada uno de los índices, pero esto apenas ayudó y afectó severamente mi base de datos.Paginación de servidor de SQL de Microsoft

Me di cuenta de que la paginación de stackoverflow solo toma alrededor de 500 milisegundos, independientemente de los criterios de clasificación o el número de página en el que haga clic. ¿Alguien sabe cómo hacer que la búsqueda funcione de manera eficiente en SQL Server 2008 con millones de filas? Esto incluiría obtener el total de filas de la manera más eficiente posible.

Mi consulta actual tiene exactamente la misma lógica ya que esta cuestión StackOverflow sobre paginación: Best paging solution using SQL Server 2005?

+0

Cualquier posibilidad de que pueda publicar la consulta; principios generales es un tipo agradable, pero tiene problemas en el mundo real;) – u07ch

+0

¿No agrega un índice en cada columna que desea ordenar por (o filtrar), ayuda? Me parece obvio, pero no sé si lo intentaste. – bart

+0

Tengo índices en todas las columnas. Después de buscar más allá de los primeros miles, los tiempos de consulta comienzan a aumentar linealmente ... – jjxtra

Respuesta

5

Alguien sabe cómo hacer el trabajo de manera eficiente paginación en SQL Server 2008 con millones de filas?

Si desea una paginación perfecta y precisa, no hay sustituto para construir una clave de índice (número de fila de posición) para cada registro. Sin embargo, hay alternativas.

(1) número total de páginas (registros)

  • puede utilizar una aproximación de sysindexes.rows (casi instantánea) suponiendo que la tasa de cambio es pequeño.
  • Puede utilizar disparadores para mantener un completamente exacta, a la segunda fila, tabla de conteos

(2) paginación

(a)
Usted puede mostrar la página salta dentro dicen que los próximos cinco páginas a ambos lados de un registro. Estos deben escanear como máximo {tamaño de página} x 5 en cada lado. Si su consulta subyacente se presta a viajar a lo largo del orden de clasificación rápidamente, esto no debería ser lento. Así que dado un resultado de X, se puede ir a la página anterior usando (orden de clasificación asumiendo es a asc, b desc

select top(@pagesize) t.* 
from tbl x 
inner join tbl t on (t.a = x.a and t.b > x.b) OR 
        (t.a < a.x) 
where x.id = @X 
order by t.a asc, t.b desc 

(es decir, la última {tamaño de página} de los registros anteriores a X)

Para ir cinco páginas atrás , lo aumenta a TOP (@ pagesize * 5) y luego a TOP (@pagesize) desde esa subconsulta

Abajo: Esta opción requiere que no pueda saltar directamente a una ubicación en particular, sus opciones son PRIMERO (fácil) , ÚLTIMO (fácil), SIGUIENTE/ANTERIOR, < 5 páginas a cada lado

(b)
Si la paginación siempre va a ser bastante específica y predecible, mantenga una vista INDEXED o una tabla actualizada por el activador que no contenga espacios en el número de fila. Esta puede ser una opción si las tablas normalmente solo ven actualizaciones en un extremo del espectro, con las brechas de las eliminaciones fácilmente llenas rápidamente cambiando los registros que no son tantos.

Este enfoque le da un recuento de filas (última fila) y también acceso directo a cualquier página.

+0

Esto fue muy bien pensado, gracias, intentaré algunas de estas cosas – jjxtra

+1

Lo que terminé haciendo fue usar mi índice Lucene para paginación cuando el número total de resultados fue menor (menos de 100K). Cuando era más alto, utilicé SQL Server. El servidor Sql apesta en paginar pequeños conjuntos de resultados en tablas enormes. Lucene es excelente para buscar conjuntos de resultados más pequeños en grandes conjuntos de datos. – jjxtra

+0

Podría marcar esto como correcto, ya que es tan bueno como uno puede obtener con solo usar SQL Server. El enfoque híbrido que mencioné arriba está funcionando muy bien. – jjxtra

Cuestiones relacionadas