L’ordine di un’istruzione SQL Select senza Order By clausola

Come so, dalla teoria del database relazionale, una dichiarazione di select senza una clausola order by deve essere considerata non ha un ordine particolare. Ma in realtà in SQL Server e Oracle (ho provato su quelle 2 piattaforms), se faccio una query da una tabella senza una clausola order by più volte, ottengo sempre i risultati nello stesso ordine. Questo comportamento può essere invocato? Qualcuno può aiutare a spiegare un po ‘?

No, non si può fare affidamento su questo comportamento. L’ordine è determinato dal modo in cui il pianificatore di query ha deciso di creare il set di risultati. query semplici come select * from foo_table possono essere restituite nell’ordine in cui sono memorizzate su disco, che possono essere in ordine di chiave primaria o nell’ordine in cui sono state create, o qualche altro ordine casuale. query più complesse, come select * from foo where bar < 10 può invece essere restituita in ordine di una colonna diversa, in base a una lettura indice, o dall'ordine della tabella, per una scansione della tabella. query ancora più elaborate, con multipe where condizioni, clausole group by , union s, saranno in qualsiasi ordine che il pianificatore decida sia più efficiente da generare.

L'ordine potrebbe anche cambiare tra due query identiche solo a causa dei dati che sono cambiati tra quelle query. una clausola "where" può essere soddisfatta con una scansione dell'indice in una query, ma gli inserimenti successivi potrebbero rendere questa condizione meno selettiva e il pianificatore potrebbe decidere di eseguire una query successiva utilizzando una scansione della tabella.


Per mettere un punto più preciso su di esso. I sistemi RDBMS hanno il mandato di darti esattamente quello che hai chiesto, nel modo più efficiente ansible. Tale efficienza può assumere molte forms, tra cui la minimizzazione dell'IO (sia su disco che sulla rete per inviare dati all'utente), riducendo al minimo la CPU e mantenendo le dimensioni del proprio working set di piccole dimensioni (utilizzando metodi che richiedono una memoria temporanea minima).

senza una clausola ORDER BY , non avrai chiesto esattamente un ordine particolare, quindi l'RDBMS ti assegnerà quelle righe in un ordine che (forse) corrisponde a qualche aspetto coincidente della query, basato su qualsiasi algoritmo che l'RDBMS si aspetta di produrre i dati il ​​più veloce

Se ti interessa l'efficienza, ma non l'ordine, salta la clausola ORDER BY . Se ti interessa l'ordine ma non l'efficienza, utilizza la clausola ORDER BY .

Poiché ti interessa realmente ENTRAMBI utilizzare ORDER BY e quindi ottimizzare la query e il database in modo che sia efficiente.

No, non puoi fare affidamento sul recupero dei risultati nello stesso ordine ogni volta. L’ho scoperto quando lavoro su una pagina web con una griglia di paging. Quando sono andato alla pagina successiva, e poi di nuovo alla pagina precedente, la pagina precedente conteneva diversi record! Ero totalmente disorientato.

Per risultati prevedibili, quindi, è necessario includere un ORDER BY . Anche allora, se ci sono valori identici nelle colonne specificate, puoi ottenere risultati diversi. Potrebbe essere necessario ORDER BY campi che non pensavi davvero di aver bisogno, solo per ottenere un risultato prevedibile.

Tom Kyte ha una pessima opinione su questo argomento . Per qualsiasi motivo, la gente ne è affascinata e continua a cercare di trovare casi in cui è ansible fare affidamento su un ordine specifico senza specificare ORDER BY. Come altri hanno affermato, non è ansible. Ecco un’altra discussione divertente sull’argomento sul sito Web di AskTom.

La risposta giusta

Questa è una nuova risposta aggiunta per correggere quella vecchia. Ho una risposta da Tom Kyte e la inserisco qui:

Se vuoi ordinare le righe, DEVI UTILIZZARE UN ORDINE. No se, e, o buts a riguardo. periodo. http://tkyte.blogspot.ru/2005/08/order-in-court.html Hai bisogno di ordinare su quello IOT. Le righe vengono ordinate in blocchi foglia, ma i blocchi foglia non vengono memorizzati ordinati. scansione completa veloce = righe non ordinate.

https://twitter.com/oracleasktom/status/625318150590980097

https://twitter.com/oracleasktom/status/625316875338149888


La risposta sbagliata

( Attenzione! La risposta originale alla domanda è stata posta qui di seguito solo per il gusto della storia. È una risposta sbagliata. La risposta giusta è posta sopra)

Come ha scritto Tom Kyte nell’articolo menzionato prima:

Dovresti pensare a una tabella organizzata come una grande serie di righe non ordinate. Queste righe verranno visualizzate in ordine apparentemente casuale e, a seconda delle altre opzioni utilizzate (query parallele, diverse modalità di ottimizzazione e così via), potrebbero apparire in un ordine diverso con la stessa query. Non contare mai sull’ordine delle righe da una query, a meno che tu non abbia un’istruzione ORDER BY sulla tua query!

Ma nota che parla solo di tabelle organizzate nell’heap. Ma ci sono anche tabelle con indice di indice. In tal caso, è ansible fare affidamento sull’ordine della selezione senza ORDER BY perché l’ordine è implicitamente definito dalla chiave primaria. È vero per Oracle.

Per gli indici cluster di SQL Server (tabelle organizzate per indice) creati per impostazione predefinita. Esiste anche la possibilità che le informazioni sugli archivi di PostgreSQL si allineino per indice. Maggiori informazioni possono essere trovate qui

AGGIORNAMENTO: Vedo che c’è un voto basso sulla mia risposta. Quindi proverei a spiegare un po ‘il mio punto. Nella sezione Panoramica delle tabelle organizzate per indice c’è una frase:

In una tabella organizzata in base all’indice, le righe vengono memorizzate in un indice definito sulla chiave primaria per la tabella … Le tabelle organizzate in base all’indice sono utili quando devono essere archiviate parti di dati correlate o i dati devono essere archiviati fisicamente in un ordine specifico.

http://docs.oracle.com/cd/E25054_01/server.1111/e25789/indexiot.htm#CBBJEBIH

A causa dell’indice, tutti i dati sono memorizzati in ordine specifico, credo che sia lo stesso per Pg. http://www.postgresql.org/docs/9.2/static/sql-cluster.html

Se non sei d’accordo con me per favore dammi un link sulla documentazione. Sarò felice di sapere che c’è qualcosa da imparare per me.