2010-03-15 9 views
15

para tablas con> 1,000,000 filas y posiblemente muchas ¡muchas más!Paginación eficiente con tablas grandes en sql 2008

no he hecho ningún punto de referencia yo mismo, así que quería obtener la opinión de los expertos.

examinado algunos artículos sobre row_number() pero parece tener consecuencias en el rendimiento

¿Cuáles son las otras opciones/alternativas?

+0

¿te importaría compartir los artículos que muestran que row_number() no funciona ... –

+0

Todas las consultas menos triviales requieren índices y estadísticas actualizadas para un buen rendimiento. –

+0

Duplicado: http://stackoverflow.com/questions/1897436/row-number-over-not-fast-enough-with-large-result-set-any-good-solution –

Respuesta

18

Utilizamos row_number() con gran efecto y realmente no ha habido ningún problema de rendimiento con él. La estructura básica de nuestras consultas paginados se ve así:

WITH result_set AS (
    SELECT 
    ROW_NUMBER() OVER (ORDER BY <ordering>) AS [row_number], 
    x, y, z 
    FROM 
    table 
    WHERE 
    <search-clauses> 
) SELECT 
    * 
FROM 
    result_set 
WHERE 
    [row_number] BETWEEN a AND b 

Funciona bien para nosotros en las tablas con filas> 1.000.000.

+0

entiendo el rendimiento es una función de carga del servidor y recursos del servidor entre otros, pls ver los dos enlaces en mis comentarios anteriores para un pov alternativo – Kumar

+2

Como dije, realmente utilizamos esto en producción en tablas con> 1,000,000 de registros. Los resultados vuelven en <100ms (dependiendo de los criterios de búsqueda, por supuesto). Por supuesto, el rendimiento va a ser una función de la carga del servidor, y también su escenario de uso específico. –

+1

Supongo que tiene suficiente cantidad de RAM, por lo que la tabla está completamente en caché. Acabo de probar con una simple tabla 'persona (correo electrónico, nombre, apellido)' que contiene 3.000.000 de registros, pero para paginar los últimos registros lleva 6 segundos con la consulta anterior. Estoy usando sql server 2008 r2. Me he perdido algo. – broadband

Cuestiones relacionadas