Tengo una Employee
tabla que tiene un millón de registros. Tengo el siguiente SQL para paginar datos en una aplicación web. Esta funcionando bien Sin embargo, lo que veo como un problema es que la tabla derivada tblEmployee
selecciona todos los registros de la Employee
tabla (para crear los MyRowNumber
valores).
Creo que esto provoca la selección de todos los registros en la Employee
tabla.
¿Realmente funciona así? ¿O SQL Server está optimizado para seleccionar solo los 5 registros de la Employee
tabla original también?
DECLARE @Index INT;
DECLARE @PageSize INT;
SET @Index = 3;
SET @PageSize = 5;
SELECT * FROM
(SELECT ROW_NUMBER() OVER (ORDER BY EmpID asc) as MyRowNumber,*
FROM Employee) tblEmployee
WHERE MyRowNumber BETWEEN ( ((@Index - 1) * @PageSize )+ 1) AND @Index*@PageSize
Respuestas:
Una alternativa a la prueba podría ser:
Sí, golpeó la tabla dos veces, pero en el CTE donde escanea toda la tabla solo está agarrando la clave, no TODOS los datos. Pero realmente deberías mirar este artículo:
http://www.sqlservercentral.com/articles/T-SQL/66030/
Y la discusión de seguimiento:
http://www.sqlservercentral.com/Forums/Topic672980-329-1.aspx
En SQL Server 2012, por supuesto, puede usar la nueva
OFFSET
/FETCH NEXT
sintaxis:fuente
Aunque es posible que no conozca el mecanismo detrás de esto, puede probarlo usted mismo comparando el rendimiento de su consulta con: seleccione * de Empleado.
Las versiones más recientes de SQL Server hacen un buen trabajo de optimización, pero puede depender de varios factores.
El rendimiento de su función ROW_NUMBER dependerá de la cláusula Order By. En su ejemplo, la mayoría diría que EmpID es la clave principal.
Hay algunas cláusulas where que son tan complejas y / o están mal codificadas o indexadas, que es mejor que solo devuelva todo el conjunto de datos (es raro y se puede arreglar). Usar ENTRE tiene problemas.
Antes de asumir que sería mejor devolver todas las filas a su aplicación y dejar que lo resuelva, debe trabajar para optimizar su consulta. Consulta las estimaciones. Pregunte al analizador de consultas. Prueba algunas alternativas.
fuente
Sé que la pregunta es con respecto a row_number () pero quiero agregar una nueva característica de sql server 2012. En sql server 2012 se introdujo la nueva característica OFFSET Fetch y es muy rápida que row_number (). Lo he usado y me da buenos resultados, espero que ustedes también llenen la misma experiencia.
Encontré un ejemplo en http://blogfornet.com/2013/06/sql-server-2012-offset-use/
lo cual es útil Espero que también te ayude a implementar nuevas funciones ...
fuente
No creo que evalúe devolver todas las filas en la tabla original. El servidor SQL optimiza. De lo contrario, tomará una gran cantidad de tiempo seleccionar un millón de entradas. Actualmente estoy usando esto y es mucho más rápido que seleccionar todas las filas. Entonces, seguro no obtiene todas las filas. Sin embargo, es más lento que solo buscar las primeras cinco filas, probablemente debido al tiempo que toma ordenar
fuente
fuente