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 BY
clá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?
Respuestas:
De Wikipedia :
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 BY
cláusula, si el orden es importante.fuente
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.
fuente