SQL Server, TOP versus ROW_NUMBER

8

Estoy aprendiendo sobre los planes de ejecución y estoy probando diferentes consultas y comparando su rendimiento y me topé con esto:

SELECT StatisticID
FROM (
    SELECT StatisticID, ROW_NUMBER() OVER (ORDER BY StatisticID) AS rn
    FROM FTCatalog.Statistic
    ) AS T
WHERE T.rn <= 1000
ORDER BY rn

SELECT TOP 1000 StatisticID
FROM FTCatalog.Statistic
ORDER BY StatisticID

Ambos devuelven el mismo conjunto de resultados; sin embargo, el primero se ejecuta más rápido y consume menos recursos (al menos SSMS me dice que) Aquí hay planes de ejecución: Planes de ejecucion

Comparación de SQL Query Plan Explorer: ingrese la descripción de la imagen aquí ¿Alguien podría darme una idea de lo que realmente está sucediendo detrás de escena y por qué los resultados difieren? Si necesita algo más, hágamelo saber.

Gracias Evaldas.

Evaldas Buinauskas
fuente
Por alguna razón, SQL Server no tiene buenas reescrituras de consultas para consultas de paginación. Estas diferencias en el plan y la estimación no deberían existir para un caso tan común.
usr

Respuestas:

11

Supongo que está comparando los costos estimados de las consultas. Esas son solo estimaciones basadas en (entre otras cosas) el número estimado de filas devueltas por la consulta. No es el número real de filas.

Su primera consulta estimó que devolvería 30 filas y su segunda consulta estimó 1000 filas. De ahí proviene su diferencia en el costo de la consulta.

Si cambia las consultas para obtener solo 30 filas, verá que las filas estimadas son las mismas para las consultas y la primera consulta en realidad tiene un costo un poco más alto, al menos para mí en SQL Server 2014.

No utilice las estimaciones al comparar el rendimiento de las consultas. Utilice cosas como la duración, el número de lecturas y el tamaño de las concesiones de memoria.

Mikael Eriksson
fuente
1
Para determinar el rendimiento real, ejecute cada una de las consultas varias veces (GO 10) con la opción Incluir estadísticas del cliente. Sospecho que encontrará que los tiempos de ejecución reales están más cerca que las estimaciones de costos relativos. No hay magia debajo de las sábanas; Los operadores del plan de consulta cuentan la historia real.
Dan Guzman
¿El costo relativo (expresión de porcentaje) realmente significa algo en SSMS? Eso me estaba molestando más.
Evaldas Buinauskas
@EvaldasBuinauskas No estoy seguro si el costo relativo es útil para algo. Quizás a veces, pero no creo que eso pueda valer la confusión que crea cuando las personas comienzan a usar el porcentaje estimado para comparar el rendimiento de diferentes consultas. Siempre será una estimación y las estimaciones son siempre (casi) incorrectas.
Mikael Eriksson
@EvaldasBuinauskas, esos costos se recopilan durante el proceso de optimización y se exponen, pero no pretenden ser un indicador o tiempos de ejecución reales. Los costos son solo una mejor suposición. Ver blogs.msdn.com/b/sqlqueryprocessing/archive/2006/10/11/…
Dan Guzman