In quale ordine le righe recuperate sono assenti dalla clausola ORDER BY?


11

Un programmatore sta testando e confrontando la stessa applicazione che utilizza la stessa struttura di database e gli stessi dati, solo in due database separati, uno con Oracle 8 e uno con Oracle 9.

L'app esegue una query senza ORDER BY clausole.

Afferma che la query ORDER-BY-less dovrebbe restituire le righe nello stesso ordine in entrambi i database.

Gli dico che non esiste alcuna garanzia dello stesso ordine di riga a meno che tu non esplicitamente fornisca una clausola ORDER BY.

Il database ha gli stessi indici e chiavi. Ma il piano esplicativo mostra che in uno dei database il motore utilizza la chiave di una delle tabelle unite mentre nell'altro database ne utilizza un'altra.

Insinua che i due ambienti DB non sono uguali, il che è dovuto al fatto che hanno statistiche diverse, motori rdbms diversi, ecc., Ma non perché non sono riuscito a replicare ogni indice del database originale.

Gli dico che deve esplicitamente fornire una ORDER BYclausola se l'ordine è davvero così importante.

La domanda

Quindi posso spiegarlo meglio:

In quale ordine una query recupera le righe quando non esplicitamente fornisce una clausola ORDER BY, e perché quella query non restituisce le righe nello stesso ordine?


3
Non è definito. Non credo che la specifica SQL stabilisca l'ordine specifico in cui i record devono essere restituiti, quindi dipenderà dall'implementazione.
Robert Harvey,

1
@RobertHarvey Questo è esattamente il motivo per cui glielo dico. In effetti: per definizione le tabelle relazionali non devono avere un ordine particolare.
Tulains Córdova,

1
Potrebbe avere senso anche sulla stessa identica versione del software utilizzare un indice diverso perché potrebbe essere più selettivo in base alle statistiche dell'indice che ha raccolto per i dati esatti in quel database. Quindi non puoi davvero fare affidamento sull'ordine se non lo specifichi.
psr

Puoi realisticamente aspettarti che la prima query per colonna non indicizzata segua l'ordine "inserisci tempo"; per "tempo di aggiornamento" indicizzato. Le richieste consecutive possono essere "contaminate" dai risultati memorizzati nella cache e quindi abbastanza casuali; tuttavia non dipende mai da esso: può cambiare da versione a versione, da parametri, da operazioni di aggiornamento e da maltempo durante la luna piena. "Undefined" è la risposta corretta, e qualsiasi altra cosa è ipotizzata nella migliore delle ipotesi.
SF.

1
I set di risultati restituiti da RDMBS-es sono proprio questi: set , che per definizione non hanno un ordine particolare. Quindi RDBMS può restituirli nell'ordine che preferisce e modificare nuovamente l'ordine alla successiva esecuzione della query. Affidarsi a un particolare ordine senza una clausola ORDER BY sarebbe un errore. Cerco sempre di spiegare questo ai miei colleghi, ma ho successo solo per metà del tempo: D.
Radu Murzea,

Risposte:


25

Da Wikipedia :

La clausola ORDER BY identifica quali colonne vengono utilizzate per ordinare i dati risultanti e in quale direzione devono essere ordinate (le opzioni sono in ordine crescente o decrescente). Senza una clausola ORDER BY, l'ordine delle righe restituite da una query SQL non è definito.

Quindi non è definito.

La specifica SQL non indica l'ordine specifico in cui i record devono essere restituiti, quindi dipenderà dall'implementazione.

Senza indici nella tabella, l'ordine sensibile sarebbe l'ordine in cui sono stati inseriti i record. Con una chiave primaria definita, l'ordine sensibile sarebbe l'ordine della chiave primaria. Ma poiché le specifiche ANSI non richiedono un ordine specifico, spetta al venditore e la loro sensibilità può differire dalla tua o dalla mia.

Poiché l'ordine non è indicato nelle specifiche, non è saggio fare affidamento sul comportamento dell'implementazione di un determinato fornitore, poiché può variare da un fornitore all'altro e il fornitore può modificare l'ordine in qualsiasi momento lo desideri, senza preavviso.

Come hai detto, includi solo la ORDER BYclausola, se l'ordine è importante.


La query ha diverse tabelle unite. Quindi un motore DB ordina il set di risultati in base a un criterio e l'altro DB utilizza un altro criterio. Ovviamente, quando viene fornita una clausola ORDER BY, entrambe le query restituiscono le righe nell'ordine specificato.
Tulains Córdova,

+1 AFAICR è persino possibile variare l'ordine ogni volta che si esegue una determinata query su una particolare istanza del database.
MarkJ,

2
Direi che, senza una clausola ORDER BY, l'unico ordine di risultato ragionevole è qualunque cosa crei il minimo overhead. Per i motori e le query di archiviazione DB semplici, questo sarà spesso un ordine di inserimento (e per le chiavi primarie generate è uguale all'ordine delle chiavi primarie). Ma non appena avrai un hash in là, mi aspetto che l'ordine sia essenzialmente casuale.
Michael Borgwardt,

2

Ovviamente sottolineando che le specifiche non dicono in che ordine arrivano i dati, non ha funzionato. Probabilmente perché sa che i dati sono su un disco o in memoria da qualche parte e quindi li ha come un ordine. Chiedigli qual è l'ordine dei dati calcolati da diverse tabelle. Vale a dire creare un esempio in cui unire 4 tabelle, facendo un calcolo su 2 di esse e restituendo solo il valore calcolato.

Il motore restituisce i dati nell'ordine in cui li trova (in assenza di un ordine), ma il modo in cui li trova dipende da fattori che possono cambiare: indice, statistiche, cache. Generalmente i dati saranno in un ordine coerente, ma se si dipende dall'ordine, è necessario richiederlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.