ejemplos - sentencia top sql
¿Cómo funciona SELECT TOP cuando no se especifica ningún orden? (1)
La documentación de msdn dice que cuando escribimos
SELECT TOP(N) ..... ORDER BY [COLUMN]
Obtenemos las filas superiores (n) que están ordenadas por column
( asc
o desc
dependiendo de lo que elegimos)
Pero si no especificamos ningún orden, msdn dice random
como Gail Erickson
señaló aquí . Como él señala, debe ser unspecified
lugar de random
. Pero como Thomas Lee
señala que
Cuando TOP se usa junto con la cláusula ORDER BY, el conjunto de resultados se limita al primer número N de filas ordenadas; De lo contrario, devuelve el primer número N de filas ramdom.
Entonces, ejecuté esta consulta en una tabla que no tiene ningún índice, primero ejecuté esto ...
SELECT *
FROM
sys.objects so
WHERE
so.object_id NOT IN (SELECT si.object_id
FROM
sys.index_columns si)
AND so.type_desc = N''USER_TABLE''
Y luego, en una de esas tablas, (de hecho, intenté la consulta a continuación en todas las tablas devueltas por la consulta anterior) y siempre obtuve las mismas filas.
SELECT TOP (2) *
FROM
MstConfigSettings
Esto siempre devolvió las mismas 2 filas, y lo mismo es cierto para todas las otras tablas devueltas por la consulta 1. Ahora los planes de ejecución muestran 3 pasos ...
Como puede ver, no hay búsqueda de índice, es solo un escaneo de tabla puro, y
La parte Top
muestra el número real de filas para ser 2, y también lo hace la Table Scan
la Table Scan
; Que no es el caso (hay muchas filas).
Pero cuando corro algo como
SELECT TOP (2) *
FROM
MstConfigSettings
ORDER BY
DefaultItemId
El plan de ejecución muestra
y
Entonces, cuando no aplico ORDER BY
los pasos son diferentes (no hay orden). Pero la pregunta es ¿cómo funciona este TOP
cuando no hay una Sort
y por qué y cómo siempre da el mismo resultado?
No hay garantía de que dos filas obtienes. Solo serán los dos primeros recuperados de la exploración de la tabla.
El iterador TOP
en el plan de ejecución dejará de solicitar filas una vez que se hayan devuelto dos.
Probablemente para una exploración de un montón, estas serán las primeras dos filas en el orden de asignación, pero esto no está garantizado. Por ejemplo, SQL Server podría usar la función de escaneo avanzado , lo que significa que su escaneo leerá páginas recientemente leídas de otro escaneo concurrente.