EDITAR:Todavía estoy esperando más respuestas. ¡Gracias!¿Cuál es un método eficiente de paginación a través de conjuntos de resultados muy grandes en SQL Server 2005?
En SQL 2000 días, solía utilizar el método de tabla temporal donde se crea una tabla temporal con la columna de identidad nuevo y luego seleccione la clave principal en la columna de identidad entre A y B.
Cuando SQL 2005 vino descubrí Row_Number()
y lo he estado utilizando desde ...
Pero ahora, encontré un problema de rendimiento grave con Row_Number()
. Funciona muy bien cuando trabajas con conjuntos de resultados no tan gigantescos y clasificas en una columna de identidad. Sin embargo, tiene un rendimiento muy bajo cuando trabaja con grandes conjuntos de resultados como más de 10.000 registros y clasificándolo sobre la columna sin identidad. Row_Number()
funciona mal incluso si ordena por una columna de identidad si el conjunto de resultados es más de 250,000 registros. Para mí, se trataba de un punto donde se genera un error, "comando de tiempo de espera!"
¿Qué se usa para hacer paginate un gran conjunto de resultados en SQL 2005? ¿El método de tabla temporal es aún mejor en este caso? No estoy seguro de si este método using temp table with SET ROWCOUNT funcionará mejor ... Pero algunos dicen que hay un problema de dar un número de fila incorrecto si tiene una clave primaria de múltiples columnas.
En mi caso, necesito poder ordenar el conjunto de resultados por una columna de tipo de fecha ... para mi aplicación web de producción.
Déjame saber lo que usas para paginación de alto rendimiento en SQL 2005. Y también me gustaría saber una forma inteligente de crear índices. Sospecho que elegir claves primarias correctas y/o índices (agrupados/no agrupados) jugará un papel importante aquí.
Gracias de antemano.
P.S. ¿Alguien sabe lo que usa stackoverflow?
EDIT: mina se ve algo como ...
SELECT postID, postTitle, postDate
FROM
(SELECT postID, postTitle, postDate,
ROW_NUMBER() OVER(ORDER BY postDate DESC, postID DESC) as RowNum
FROM MyTable
) as DerivedMyTable
WHERE RowNum BETWEEN @startRowIndex AND (@startRowIndex + @maximumRows) - 1
postID: Int, Identidad (incremento automático), clave primaria
son posteriores: DateTime
EDIT: ¿Todos usan Row_Number()?
Gracias por su aportación. Actualicé mi pregunta –