2011-12-23 12 views
5

Tengo una tabla con un índice agrupado de PK así como otros índices, únicos y no exclusivos. Si expido (exactamente):Ordenar el orden de los resultados para Seleccionar SIN WHERE o ORDER BY Cláusula

SELECT * FROM table_name 

o

SELECT col1, col2 FROM table_name 

en qué orden se devuelven las filas?

Esta es la primera pregunta en un cuestionario de entrevista que un cliente nos ha enviado. Aquí están las instrucciones:

Si la respuesta a esta pregunta es incorrecta, ¡termine la entrevista inmediatamente! El individuo, independientemente de su capacidad declarada, no comprende los sistemas de administración de bases de datos relacionales basados ​​en SQL. Esta es la lógica SQL-101 de los últimos 25 años. La respuesta correcta es: "desconocido/aleatorio/indeterminado porque no se ha especificado ninguna cláusula ORDER BY como parte de la consulta".

De alguna manera no estoy convencido de que esto sea realmente correcto. Todos los comentarios son bienvenidos.

Gracias,

Raj

Respuesta

8

Incluso si una tabla tiene un/índice agrupado de clave principal, no se puede estar seguro acerca de la orden de las filas. Aunque en el plan de ejecución habrá un análisis de índice/montón al final, si la consulta se realiza en paralelo en muchos núcleos, el conjunto de datos resultante no se ordenará debido a las fusiones paralelas del paso del plan de fusión.

Probablemente no lo vea en bases de datos pequeñas, pero intente crear uno con muchos archivos en discos duros separados y ejecute una consulta simple en una máquina multinúcleo. Lo más probable es que obtenga los resultados "parcialmente ordenados" por ID, es decir, habrá bloques en los que se ordenarán las filas, pero los bloques se recuperarán en orden semialeatorio.

+1

+1 También podría obtener un escaneo ordenado por asignación en algunas condiciones o SQL Server podría usar la función de escaneo avanzado/escaneo. [Ver también esta respuesta] (http://stackoverflow.com/questions/7116004/guarantee-order-of-table-valued-function-results/7117186#7117186) –

5

Las instrucciones se refieren a SQL en un nivel conceptual, en el que el resultado de una consulta es una relación, y las relaciones son desordenadas. Pasando de lo conceptual a lo real, la razón por la que no se define un orden implícito en el estándar SQL es para que los RDBMS puedan devolver cualquier orden que sea más eficiente para su implementación.

Cuestiones relacionadas