El orden de una instrucción SQL Select sin cláusula Order By

Como sé, a partir de la teoría de base de datos relacional, una instrucción select sin una cláusula order by debe considerarse que no tiene un orden particular. Pero en realidad en SQL Server y Oracle (he probado en esas 2 plataformas), si consulto varias tablas desde una tabla sin una cláusula order by , siempre obtengo los resultados en el mismo orden. ¿Se puede confiar en este comportamiento? ¿Alguien puede ayudar a explicar un poco?

No, no se puede confiar en ese comportamiento. El orden está determinado por la forma en que el planificador de consultas ha decidido crear el conjunto de resultados. es probable que se devuelvan consultas simples como select * from foo_table en el orden en que están almacenadas en el disco, que pueden estar en orden de clave principal o en el orden en que se crearon, o en algún otro orden aleatorio. consultas más complejas, como select * from foo where bar < 10 puede en su lugar ser devuelta en orden de una columna diferente, basada en una lectura de índice, o por orden de tabla, para una exploración de tabla. consultas aún más elaboradas, con multípedas where condiciones, las cláusulas de group by , las union , estarán en el orden que el planificador decida que es más eficiente para generar.

El pedido incluso podría cambiar entre dos consultas idénticas solo por los datos que han cambiado entre esas consultas. una cláusula "donde" puede ser satisfecha con un escaneo de índice en una consulta, pero las inserciones posteriores podrían hacer que esa condición sea menos selectiva, y el planificador podría decidir realizar una consulta posterior usando un escaneo de tabla.


Para poner un punto más fino en él. Los sistemas RDBMS tienen el mandato de brindarle exactamente lo que usted solicitó, de la manera más eficiente posible. Esa eficiencia puede tomar muchas formas, incluida la minimización de IO (tanto en el disco como a través de la red para enviarle datos), minimizando la CPU y manteniendo el tamaño de su conjunto de trabajo pequeño (usando métodos que requieren un almacenamiento temporal mínimo).

sin una cláusula ORDER BY , no habrá pedido exactamente un pedido en particular, por lo que el RDBMS le dará esas filas en un orden que (tal vez) corresponde con algún aspecto coincidente de la consulta, basado en el algoritmo que el RDBMS espera producir los datos más rápido.

Si le importa la eficiencia, pero no el orden, omita la cláusula ORDER BY . Si le importa el orden pero no la eficiencia, use la cláusula ORDER BY .

Ya que realmente te importa tanto, utiliza ORDER BY y luego ajusta con cuidado tu consulta y base de datos para que sea eficiente.

No, no puede confiar en obtener los resultados nuevamente en el mismo orden cada vez. Lo descubrí cuando trabajaba en una página web con una cuadrícula paginada. Cuando fui a la página siguiente y luego a la página anterior, ¡la página anterior contenía registros diferentes! Estaba totalmente desconcertado.

Para resultados predecibles, entonces, debe incluir un ORDER BY . Incluso entonces, si hay valores idénticos en las columnas especificadas allí, puede obtener resultados diferentes. Es posible que tenga que ORDER BY campos que realmente no cree que necesita, solo para obtener un resultado predecible.

Tom Kyte tiene una mascota molesta por este tema . Por alguna razón, la gente está fascinada con esto y sigue tratando de encontrar casos en los que pueda confiar en un pedido específico sin especificar ORDER BY. Como otros han declarado, no puedes. Aquí hay otro hilo divertido sobre el tema en el sitio web AskTom.

La respuesta correcta

Esta es una nueva respuesta agregada para corregir la anterior. Recibí una respuesta de Tom Kyte y la publico aquí:

Si quiere filas ordenadas USTED TIENE QUE UTILIZAR UNA ORDEN. No si, y, o si no tiene nada al respecto. período. http://tkyte.blogspot.ru/2005/08/order-in-court.html Usted necesita ordenar por ese IOT. Las filas se clasifican en bloques de hojas, pero los bloques de hojas no se almacenan ordenados. exploración rápida completa = filas sin clasificar.

https://twitter.com/oracleasktom/status/625318150590980097

https://twitter.com/oracleasktom/status/625316875338149888


La respuesta incorrecta

( ¡Atención! La respuesta original a la pregunta se colocó aquí debajo solo por el bien de la historia. Es una respuesta incorrecta. La respuesta correcta se encuentra arriba)

Como escribió Tom Kyte en el artículo mencionado anteriormente:

Debería pensar en una tabla organizada en montón como una gran colección desordenada de filas. Estas filas aparecerán en un orden aparentemente aleatorio y, dependiendo de otras opciones que se usen (consultas paralelas, modos de optimizador diferentes, etc.), pueden aparecer en un orden diferente con la misma consulta. ¡Nunca cuente el orden de las filas de una consulta a menos que tenga una instrucción ORDER BY en su consulta!

Pero tenga en cuenta que solo habla de tablas organizadas en montón. Pero también hay tablas indexadas. En ese caso, puede confiar en el orden de la selección sin ORDER BY porque la orden está implícitamente definida por la clave principal. Es cierto para Oracle.

Para los índices en clúster de SQL Server (tablas organizadas por índice) creadas de manera predeterminada. También existe la posibilidad de que la información de la tienda PostgreSQL se alinee por índice. Más información se puede encontrar aquí

ACTUALIZACIÓN: Veo, que hay votación abajo en mi respuesta. Así que trataría de explicar mi punto un poco. En la sección Descripción general de Tablas organizadas por índice hay una frase:

En una tabla organizada por índice, las filas se almacenan en un índice definido en la clave primaria para la tabla … Las tablas organizadas por índice son útiles cuando las piezas de datos relacionadas deben almacenarse juntas o los datos deben almacenarse físicamente en un orden específico.

http://docs.oracle.com/cd/E25054_01/server.1111/e25789/indexiot.htm#CBBJEBIH

Debido al índice, todos los datos se almacenan en un orden específico, creo que lo mismo es cierto para Pg. http://www.postgresql.org/docs/9.2/static/sql-cluster.html

Si no está de acuerdo conmigo, por favor deme un enlace sobre la documentación. Estaré feliz de saber que hay algo que aprender para mí.