¿En qué orden se obtienen las filas en ausencia de la cláusula ORDER BY?

11

Un programador está probando y comparando la misma aplicación que usa la misma estructura de base de datos y los mismos datos, solo en dos bases de datos separadas, una con Oracle 8 y otra con Oracle 9.

La aplicación ejecuta una consulta sin ORDER BY cláusula.

Afirma que la consulta ORDER-BY-less debería devolver las filas en el mismo orden en ambas bases de datos.

Le digo que no hay garantía del mismo orden de fila a menos que usted proporcione explícitamente una cláusula ORDER BY

La base de datos tiene los mismos índices y claves. Pero el plan de explicación muestra que en una de las bases de datos el motor está usando la clave de una de las tablas unidas, mientras que en la otra base de datos está usando la de otra.

Insinúa que los dos entornos de base de datos no son iguales, lo que se debe a que tienen estadísticas diferentes, diferentes motores rdbms, etc., pero no porque no haya podido replicar cada índice que tiene la base de datos original.

Le digo que debe proporcionar explícitamente una ORDER BYcláusula si la orden es realmente tan importante.

La pregunta

Entonces puedo explicarlo mejor:

¿En qué orden una consulta obtiene filas cuando no proporciona explícitamente una cláusula ORDER BY, y por qué esa consulta no devuelve las filas en el mismo orden?

Tulains Córdova
fuente
3
Es indefinido No creo que la especificación SQL establezca el orden específico en que se devolverán los registros, por lo que dependerá de la implementación.
Robert Harvey
1
@RobertHarvey Eso es exactamente por lo que le digo. De hecho: por definiciones, las tablas relacionales no deben tener un orden particular.
Tulains Córdova
1
Puede tener sentido incluso en la misma versión exacta de software usar un índice diferente porque puede ser más selectivo en función de las estadísticas de índice que ha recopilado para los datos exactos en esa base de datos. Por lo tanto, realmente no puede confiar en el pedido si no lo especifica.
psr
Realmente puede esperar que la primera consulta por columna no indexada siga el orden de "tiempo de inserción"; por "tiempo de actualización" indexado. Es probable que las solicitudes consecutivas estén "contaminadas" por los resultados almacenados en caché y, por lo tanto, sean bastante aleatorias; sin embargo, nunca dependa de ello: puede cambiar de una versión a otra, por parámetros, por operaciones de actualización y por mal tiempo en la luna llena. "Indefinido" es la respuesta correcta, y cualquier otra cosa es, en el mejor de los casos, conjeturas informadas.
SF.
1
Los conjuntos de resultados devueltos por RDMBS-es son solo eso: conjuntos , que por definición no tienen un orden particular. Por lo tanto, el RDBMS puede devolverlos en el orden que desee y cambiar el orden nuevamente en la próxima ejecución de la consulta. Confiar en un orden en particular sin una cláusula ORDER BY sería un error. Siempre trato de explicar esto a mis compañeros de trabajo, pero solo tengo éxito la mitad del tiempo: D.
Radu Murzea

Respuestas:

25

De Wikipedia :

La cláusula ORDER BY identifica qué columnas se utilizan para ordenar los datos resultantes y en qué dirección deben ordenarse (las opciones son ascendentes o descendentes). Sin una cláusula ORDER BY, el orden de las filas devueltas por una consulta SQL no está definido.

Entonces no está definido.

La especificación de SQL no establece el orden específico en que se devolverán los registros, por lo que dependerá de la implementación.

Sin índices en la tabla, el orden razonable sería el orden en que se insertaron los registros. Con una clave primaria definida, el orden sensible sería el orden de la clave primaria. Pero como la especificación ANSI no requiere un pedido específico, depende del vendedor, y sus sensibilidades pueden diferir de las suyas o las mías.

Dado que el pedido no se indica en la especificación, no es prudente confiar en el comportamiento de la implementación de un proveedor en particular, ya que puede variar de un proveedor a otro, y el proveedor puede cambiar el pedido en cualquier momento que lo desee, sin previo aviso.

Como dijiste, solo incluye la ORDER BYcláusula, si el orden es importante.

Robert Harvey
fuente
La consulta tiene varias tablas unidas. Por lo tanto, un motor de base de datos clasifica el conjunto de resultados por un criterio y el otro DB utiliza otro criterio. Obviamente, cuando se proporciona una cláusula ORDER BY, ambas consultas devuelven las filas en el orden especificado.
Tulains Córdova
+1 AFAICR, el orden incluso puede variar cada vez que ejecuta una consulta determinada en una instancia de base de datos en particular.
MarkJ
2
Diría que, sin una cláusula ORDER BY, el único orden de resultado sensible es el que crea la menor sobrecarga. Para consultas y motores de almacenamiento de bases de datos simples, a menudo será el orden de inserción (y para las claves primarias generadas lo mismo que el orden de las claves primarias). Pero tan pronto como se haya unido hash allí, esperaría que la orden sea esencialmente aleatoria.
Michael Borgwardt
2

Obviamente, señalar que la especificación no dice en qué orden entran los datos, no ha funcionado. Probablemente porque sabe que los datos están en un disco o en la memoria en algún lugar y, por lo tanto, tiene eso como una orden. Pregúntele cuál es el orden de los datos calculados de varias tablas. Es decir, crea un ejemplo donde unes 4 tablas, haces un cálculo en 2 de ellas y devuelves solo el valor calculado.

El motor devuelve los datos en el orden en que los encuentra (en ausencia de un orden), pero la forma en que los encuentra depende de factores que pueden cambiar: índices, estadísticas, cachés. En general, los datos estarán en un orden consistente, pero si depende del pedido, debe solicitarlo.

jmoreno
fuente