2012-03-13 6 views
8

Cuando utiliza la cláusula SQL Server TOP en una consulta, ¿el motor de SQL Server deja de buscar filas una vez que tiene suficiente para satisfacer el TOP X necesario para ser devuelto?¿SQL Server TOP detiene el procesamiento una vez que encuentra suficientes filas?

considerar las siguientes consultas (asuma some_text_field es único y no se establece para la indización de texto completo):

SELECT 
    pk_id 
FROM 
    some_table 
WHERE 
    some_text_field = 'some_value'; 

y

SELECT TOP 1 
    pk_id 
FROM 
    some_table 
WHERE 
    some_text_field = 'some_value'; 

La primera consulta tendría que buscar en toda la mesa y vuelta todos los resultados que encontró. Sin embargo, la forma en que lo tenemos configurado, esa consulta realmente devolverá un valor. Entonces, ¿usaría TOP 1 para evitar que SQL Server escanee el resto de la tabla una vez que ha encontrado una coincidencia?

+1

Sí, se detiene después de la primera coincidencia. – MicSim

+6

Si usa 'TOP x' ** sin ** proporcionar un' ORDER BY', los resultados serán aleatorios y no predecibles. Como tal: dado que debe proporcionar un 'ORDER BY' para que la consulta tenga algún sentido, necesitará tener un índice apropiado para que el procesador de consultas pueda buscar las primeras n filas en orden y luego detenerlas - de lo contrario, toda la tabla debe escanearse y ordenarse. –

+0

@marc_s Tu comentario es la mejor respuesta. :) –

Respuesta

6

Sí, la consulta se detiene una vez que ha encontrado suficientes filas y no consulta el resto de la (s) tabla (s).

Sin embargo, tenga en cuenta que probablemente desee tener un índice que la base de datos pueda usar para la consulta. En ese caso, no hay realmente ninguna diferencia de rendimiento entre obtener el primer partido y obtener todas las coincidencias.

+0

La respuesta de Martin Smith es buena, pero esta es un poco más relevante para mis necesidades. Estoy trabajando en software antiguo/heredado, y nadie ha procesado casi ningún índice, así que estamos haciendo cosas como esta que termina realizando escaneos de tablas enteras solo para encontrar una fila de datos valiosos ... – jzimmerman2011

5

Sí.

En este caso se podrían obtener 1 fila indefinido (como TOP sin ORDER BY no garantiza ningún resultado concreto), entonces sería detener el procesamiento (El TOP iterador en el plan no se solicitará ningún más filas de iteradores niño).

Si hay un operador de bloqueo (como SORT) en el plan antes de que el operador u operadores TOP paralelas antes de la TOP puede terminar haciendo un montón de trabajo para las filas que no se devuelvan en el resultado final de todos modos sin embargo.

Cuestiones relacionadas