2009-05-22 9 views
37

En Oracle, ¿cuál es el orden predeterminado de filas para una consulta de selección si no se especifica una cláusula "ordenar por".Ordenamiento de fila predeterminado para la consulta de selección en oráculo

¿Es

  1. el orden en que las filas se insertaron
  2. no hay orden predeterminado en absoluto
  3. ninguna de las anteriores.
+0

Esta es una pregunta que muchos (He visto el pop-up en varios foros). Creo que puede ser desencadenada por la falsa creencia de que "ORDER BY" obligará a la CBO a realizar una clasificación, lo que obviamente es más costoso que realizar una consulta desordenada. Hay formas de mejorar el rendimiento de clasificación en Oracle, pero no requieren evitar la cláusula "ORDER BY". –

Respuesta

34

Según Tom Kyte: "A menos que y hasta que agregue" ordenar por "a una consulta, no puede decir NADA sobre el orden de las filas devueltas. Bueno, a excepción de" no puede confiar en el orden de las filas devuelto '. "

Ver this question en asktom.com.

En cuanto a ROWNUM, no existe físicamente, por lo que no se puede "liberar". ROWNUM se asigna después de recuperar un registro de una tabla, por lo que "WHERE ROWNUM = 5" siempre dejará de seleccionar cualquier registro.

@ammoQ: es posible que desee leer this AskTom article sobre el pedido GROUP BY. En resumen:

¿Tiene una cláusula GROUP BY en una consulta Gaurantee que los datos de salida serán ordenados en el grupo por columnas en orden, incluso si no hay un orden Por cláusula?

y dijimos ...

ABSOLUTAMENTE NO,

Nunca lo ha hecho, nunca lo hizo, nunca voluntad.

+0

Gracias, conozco ese artículo. Hace 2 años, lo estudié con mucho cuidado, después de pasar literalmente semanas con la pregunta: ¿Por qué este programa se comporta de manera diferente en 10g? –

+0

En pocas palabras, porque Oracle está haciendo algo diferente en 10g. ¡Sin embargo, no es un error en Oracle! Oracle NUNCA siad GROUP BY ordenaría los resultados, y Tom muestra cómo puede fallar en 9i. El hecho de que a menudo pareciera que eso significaba que las personas confiaban en ello.Ese artículo, además de ser informativo, es una de las ilustraciones más sorprendentes de personas que no pueden o no quieren aceptar un concepto simple, porque es diferente de sus propias observaciones anecdóticas. También es bastante divertido. SI DESEA QUE SUS DATOS SE CLASIFICEN, USE ORDER BY. – DCookie

+0

@DCookie ¿este comportamiento está limitado a Oracle o se aplica a todas las bases de datos relacionales como MySQL, Postgres? –

-5

Creo que utiliza el atributo Rownum oculto de Oracle.

Así que su # 1 es probablemente correcto asumiendo que no hubo eliminaciones que podrían haber liberado rownums para su uso posterior.

EDITAR: Como han dicho otros, realmente no deberías confiar en esto, nunca. Además de eliminar, hay muchas condiciones diferentes que pueden afectar el comportamiento de clasificación predeterminado.

+1

ROWNUM no es un atributo, sino que se asigna solo cuando se lo consulta. ROWID tampoco es un atributo; simplemente expresa el archivo, el bloque y la fila como un único valor. Se almacena en índices como el puntero a la fila real. –

19

No hay un pedido predeterminado explícito. Por razones obvias, si crea una nueva tabla, inserta algunas filas y hace un "select *" sin una cláusula "where", (muy probablemente) devolverá las filas en el orden en que fueron insertadas.

Pero nunca debe confiar en que suceda una orden predeterminada. Si necesita un pedido específico, use una cláusula "ordenar por". Por ejemplo, en las versiones de Oracle hasta 9i, hacer un "grupo por" también hacía que las filas se ordenaran por la expresión del grupo. En 10g, ¡este comportamiento ya no existe! La actualización de las instalaciones de Oracle me ha causado algo de trabajo debido a esto.

+4

Sí a la respuesta, pero a nitpick: No tan "obvio", en realidad, no hay garantía de que se inserten nuevas filas en una nueva tabla en un orden particular, y no hay garantía de que SELECT BY sin ORDER BY visite necesariamente todas los bloques en la tabla en el mismo orden en que fueron creados. –

+2

Sí, no hay garantía per se. Pero me sería difícil crear un escenario en el que no funcione así. –

+3

Si crea una tabla con 100 registros, elimina los primeros 50 y luego inserta otros 10, Oracle tenderá a reutilizar el espacio de las filas eliminadas (sujeto a muchos errores, etc.). Entonces, incluso si Oracle visita los bloques en el mismo orden, los últimos 10 registros insertados tenderán a ser los primeros en una consulta sin ORDER BY –

-3

Aunque debería ser rownnum (su número 2), realmente no está garantizado y no debe confiar en él al 100%.

+1

rownum informa la orden en el que las filas * son * devueltas; no te ayuda con el orden en que deben devolverse. –

4

Ya se ha dicho que Oracle puede darle las filas en el orden que desee, cuando no especifica una cláusula ORDER BY. Especular cuál será el orden cuando no se especifica la cláusula ORDER BY no tiene sentido. Y confiar en su código es un "movimiento limitante de carrera".

Un ejemplo sencillo:

SQL> create table t as select level id from dual connect by level <= 10 
    2/

Tabel is aangemaakt. 

SQL> select id from t 
    2/

     ID 
---------- 
     1 
     2 
     3 
     4 
     5 
     6 
     7 
     8 
     9 
     10 

10 rijen zijn geselecteerd. 

SQL> delete t where id = 6 
    2/

1 rij is verwijderd. 

SQL> insert into t values (6) 
    2/

1 rij is aangemaakt. 

SQL> select id from t 
    2/

     ID 
---------- 
     1 
     2 
     3 
     4 
     5 
     7 
     8 
     9 
     10 
     6 

10 rijen zijn geselecteerd. 

Y esto es sólo después de un simple + inserto de eliminación. Y hay muchas otras situaciones pensables. Ejecución paralela, particiones, tablas organizadas por índice para nombrar solo algunas.

En pocas palabras, como ya dijo muy bien por ammoQ: si necesita las filas ordenadas, use una cláusula ORDER BY.

+3

+1 para "movimiento de limitación de carrera" que depende del pedido de consultas desordenadas. – Ollie

+0

Para atribución, vea http://tkyte.blogspot.com/2005/08/order-in-court.html –

+0

Gracias por el enlace. De ahí es de donde obtuve esa cita. –

2

Usted absolutamente, positivamente no puede confiar en ningún pedido a menos que especifique order by. Para Oracle en particular, he visto exactamente la misma consulta (sin uniones), corrí dos veces en pocos segundos el uno del otro, en una tabla que no cambió en el ínterin, devuelve un orden muy diferente. Esto parece ser más probable cuando el conjunto de resultados es grande.

La ejecución en paralelo mencionada por Rob van Wijk probablemente explica esto. Ver también el documento Using Parallel Execution de Oracle.

-2

Se impactado por índice, si hay índice, se devolverá un orden ascendente, si no hay ningún índice, devolverá el orden insertado.

-1

Puede modificar el orden en el que los datos se almacenan en la tabla de INSERT con la cláusula de organización de la sentencia CREATE TABLE

Cuestiones relacionadas