Ordinamento di righe predefinito per query selezionate in Oracle

In Oracle, qual è l’ordine predefinito di righe per una query selezionata se non è specificata alcuna clausola “order by”.

È

  1. l’ordine in cui sono state inserite le righe
  2. non esiste alcun ordine predefinito
  3. nessuno dei precedenti.

Secondo Tom Kyte: “A meno che e fino a quando non aggiungi” ordine per “a una query, non puoi dire NULLA sull’ordine delle righe restituite, beh, a meno di” non puoi fare affidamento sull’ordine delle righe restituite “.

Vedi questa domanda su asktom.com.

Per quanto riguarda ROWNUM, non esiste fisicamente, quindi non può essere “liberato”. ROWNUM viene assegnato dopo che un record è stato recuperato da una tabella, motivo per cui “WHERE ROWNUM = 5” non riuscirà mai a selezionare alcun record.

@ammoQ: potresti leggere questo articolo AskTom su GROUP BY ordinando. In breve:

Una clausola Group By in una garanzia di query che i dati di output verranno ordinati sulle colonne Raggruppa per ordine, anche se non esiste una clausola Order By?

e abbiamo detto …

ASSOLUTAMENTE NO,

Non ha mai, non ha mai fatto, non lo farà mai.

Non esiste un ordine predefinito esplicito. Per ovvi motivi, se si crea una nuova tabella, si inseriscono alcune righe e si esegue una “selezione *” senza una clausola “where”, sarà (molto probabile) restituire le righe nell’ordine in cui sono state inserite.

Ma non dovresti mai fare affidamento su un ordine predefinito. Se hai bisogno di un ordine specifico, usa una clausola “ordina per”. Ad esempio, nelle versioni Oracle fino a 9i, l’esecuzione di un “gruppo per” ha anche causato l’ordinamento delle righe in base all’espressione di gruppo. In 10g, questo comportamento non esiste più! L’aggiornamento delle installazioni Oracle mi ha causato un po ‘di lavoro a causa di questo.

È già stato detto che Oracle può darti le righe nell’ordine che preferisce, quando non specifichi una clausola ORDER BY. Speculare quale sarà l’ordine quando non si specifica la clausola ORDER BY è inutile. E fare affidamento su di esso nel tuo codice, è una “mossa limitante della carriera”.

Un semplice esempio:

 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. 

E questo è solo dopo un semplice delete + insert. E ci sono numerose altre situazioni pensabili. Esecuzione parallela, partizioni, tabelle organizzate per indicizzare solo alcuni.

In conclusione, come già detto molto bene da ammoQ: se hai bisogno di ordinare le righe, usa una clausola ORDER BY.

Non puoi assolutamente fare affidamento su alcun ordine a meno che tu non specifichi l’ order by . In particolare per Oracle, ho visto la stessa esatta query (senza join), eseguita due volte a distanza di pochi secondi l’una dall’altra, su una tabella che non è cambiata nel frattempo, restituire un ordine completamente diverso. Questo sembra essere più probabile quando il set di risultati è grande.

L’esecuzione parallela menzionata da Rob van Wijk probabilmente lo spiega. Vedi anche Oracle’s Using Parallel Execution doc.

È ansible modificare l’ordine in cui i dati vengono archiviati nella tabella da INSERT con la clausola ORGANIZATION dell’istruzione CREATE TABLE

È influenzato dall’indice, se c’è indice, restituirà un ordine crescente, se non c’è alcun indice, restituirà l’ordine inserito.

Anche se dovrebbe essere rownnum (il tuo # 2), non è garantito e non dovresti fidarti al 100%.

Credo che usi l’attributo Rownum nascosto di Oracle.

Quindi il tuo numero 1 probabilmente ha ragione, supponendo che non ci siano state eliminazioni che potrebbero aver liberato i rownum per un uso successivo.

EDIT: Come altri hanno già detto, non dovresti mai fare affidamento su questo, mai. Inoltre, vengono eliminate molte condizioni diverse che possono influire sul comportamento di ordinamento predefinito.