TSQL ¿Por qué Top es más rápido con una variable?

10

Buenos días a todos,

He estado trabajando en algunos sql moderadamente complejos para 'obtener' algunos datos de una base de datos de productos de terceros, para mostrarlos en nuestras propias aplicaciones internas.

Agregué una selección para obtener el registro superior de una tabla dentro de una subconsulta (si eso tiene sentido)

la consulta tardó casi 3 minutos en devolver un conjunto de resultados finales de 100 registros utilizando

SELECT TOP 1 ...

Busqué mejoras en línea para lo que estaba tratando de lograr y me sugirieron que cambiara mi selección para usar una variable, como se muestra a continuación.

DECLARE @topCount INT
SET @topCount = 1

SELECT TOP (@topCount) ...

Esto tomó la misma consulta de 3 minutos a 1 segundo, ¡lo cual es genial!

Pero, ¿alguien puede explicar por qué es así?

JamesStuddart
fuente

Respuestas:

14

Cuando lo haga, top 1el optimizador de consultas creará un plan diseñado para obtener 1 fila lo más rápido posible.

Cuando utiliza una variable local, el optimizador desconoce el valor de la variable y, en su lugar, crea un plan optimizado para obtener 100 filas lo más rápido posible.

En su caso, el plan de consulta generado con un objetivo de fila de 100 es el mejor plan para usar incluso cuando solo desea una fila.

Para verificar, puede intentar agregar option (recompile)a su consulta con la variable. En ese caso, SQL Server utilizará el valor actual de @topCountcomo un objetivo de fila y, dado que es 1, debe obtener el plan lento.

Mikael Eriksson
fuente
Entiendo la diferencia en el plan, pero me sorprende que recuperar 1 fila puede ser más lento que recuperar 100 filas. Creo que si el plan de 100 filas funciona mejor, SQL Server usaría el mismo plan para top 1.
Brandon
@Brandon no obtiene 100 filas, solo construye el plan de ejecución con el supuesto de que 100 filas es lo que se desea. La ejecución termina cuando se encuentra 1 fila.
Mikael Eriksson
Verificar lo que es diferente con el plan de ejecución en estos casos probablemente ayudaría a comprender cuál es el problema con el top 1.
James Z