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.