¿Cómo funciona SELECT TOP cuando no se especifica ninguna order por?

La documentation de msdn dice que cuando escribimos

SELECT TOP(N) ..... ORDER BY [COLUMN] 

Obtenemos las principales (n) filas que están orderadas por column ( asc o desc dependiendo de lo que elijamos)

Pero si no especificamos ninguna order, msdn dice al random como señaló Gail Erickson aquí . Como él señala, debería ser unspecified lugar de random . Pero como Thomas Lee señala allí que

Cuando TOP se utiliza junto con la cláusula ORDER BY, el set de resultados está limitado al primer número N de filas orderadas; de lo contrario, devuelve el primer N número 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 demás tablas devueltas por la consulta 1. Ahora los planes de ejecución muestran 3 pasos.

enter image description here

Como puede ver, no hay una búsqueda de índice, solo se trata de una exploración de tabla pura, y

enter image description here

La parte Top muestra el número real de filas para ser 2, y también lo hace la Table Scan ; Lo cual no es el caso (hay muchas filas).

Pero cuando corro algo así

 SELECT TOP (2) * FROM MstConfigSettings ORDER BY DefaultItemId 

El plan de ejecución muestra

enter image description here

y

enter image description here

Entonces, cuando no aplico ORDER BY los pasos son diferentes (no hay ningún tipo). Pero la pregunta es ¿cómo funciona este TOP cuando no hay Sort y por qué y cómo siempre da el mismo resultado?

No hay garantía de qué dos filas obtienes. Solo serán los primeros dos recuperados del escaneo 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 escanear un montón, estas serán las dos primeras filas en el order de asignación, pero esto no está garantizado. Por ejemplo, SQL Server podría usar la function de escaneo avanzado , lo que significa que su escaneo leerá páginas leídas recientemente de otro escaneo simultáneo.