top sentencia ejemplos ejemplo datos consultas sql sql-server tsql select sql-order-by

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.