web-dev-qa-db-fra.com

Ordre des lignes par défaut pour la requête de sélection dans Oracle

Dans Oracle, quel est l'ordre par défaut des lignes pour une requête de sélection si aucune clause "order by" n'est spécifiée.

Est-ce

  1. l'ordre dans lequel les lignes ont été insérées
  2. il n'y a pas du tout de commande par défaut
  3. aucune de ces réponses.
42
sengs

Selon Tom Kyte: "A moins que et jusqu'à ce que vous ajoutiez" order by "à une requête, vous ne pouvez rien dire sur l'ordre des lignes retournées. Eh bien, à moins de" vous ne pouvez pas vous fier à l'ordre des lignes retournées "."

Voir cette question sur asktom.com.

Quant à ROWNUM, il n'existe pas physiquement, il ne peut donc pas être "libéré". ROWNUM est attribué après qu'un enregistrement a été extrait d'une table, c'est pourquoi "WHERE ROWNUM = 5" ne sélectionne toujours aucun enregistrement.

@ammoQ: vous voudrez peut-être lire cet article AskTom sur la commande GROUP BY. En bref:

Une clause Group By dans une requête garantit-elle que les données de sortie seront triées dans les colonnes Group By dans l'ordre, même s'il n'y a PAS de clause Order By?

et nous avons dit ...

ABSOLUMENT PAS,

Elle ne l'a jamais fait, elle ne l'a jamais fait, elle ne le sera jamais.

42
DCookie

Il n'y a pas de commande explicite par défaut. Pour des raisons évidentes, si vous créez une nouvelle table, insérez quelques lignes et effectuez une "select *" sans clause "where", elle retournera (très probablement) les lignes dans l'ordre où elles ont été insérées.

Mais vous ne devriez jamais vous fier à une commande par défaut. Si vous avez besoin d'une commande spécifique, utilisez une clause "order by". Par exemple, dans les versions d'Oracle jusqu'à 9i, le fait de "grouper par" a également provoqué le tri des lignes par l'expression de groupe. En 10g, ce comportement n'existe plus! La mise à niveau des installations Oracle m'a causé un certain travail à cause de cela.

21

Il a déjà été dit qu'Oracle est autorisé à vous donner les lignes dans l'ordre qu'il souhaite, lorsque vous ne spécifiez pas de clause ORDER BY. Spéculer ce que sera l'ordre lorsque vous ne spécifiez pas la clause ORDER BY est inutile. Et s'appuyer sur cela dans votre code, est un "mouvement limitant la carrière".

Un exemple simple:

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.

Et ce n'est qu'après une simple suppression + insertion. Et il existe de nombreuses autres situations imaginables. Exécution parallèle, partitions, indexation des tables organisées pour n'en nommer que quelques-unes.

Conclusion, comme déjà très bien dit par ammoQ: si vous avez besoin de trier les lignes, utilisez une clause ORDER BY.

5
Rob van Wijk

Vous ne pouvez absolument et positivement compter sur aucune commande, sauf si vous spécifiez order by. Pour Oracle en particulier, j'ai en fait vu exactement la même requête (sans jointures), exécutée deux fois en quelques secondes les unes des autres, sur une table qui n'a pas changé entre-temps, renvoyant un ordre très différent. Cela semble plus probable lorsque l'ensemble de résultats est grand.

L'exécution parallèle mentionnée par Rob van Wijk explique probablement cela. Voir aussi Oracle's sing Parallel Execution doc.

3
Kelvin