In quale ordine vengono scaricate le righe assenti nella 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 con no ORDER BY clause.

Afferma che la query ORDER-BY-less deve 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 fornisca esplicitamente una clausola ORDER BY.

Il database ha gli stessi indici e chiavi. Ma il piano spiega che in uno dei database il motore sta usando la chiave di una delle tabelle unite mentre nell'altro database sta usando un altro.

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

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

La domanda

Quindi posso spiegarlo meglio:

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

    
posta Tulains Córdova 09.08.2013 - 23:29
fonte

2 risposte

24

Da Wikipedia :

The ORDER BY clause identifies which columns are used to sort the resulting data, and in which direction they should be sorted (options are ascending or descending). Without an ORDER BY clause, the order of rows returned by an SQL query is undefined.

Quindi non è definito.

Le specifiche SQL non indicano l'ordine specifico in cui devono essere restituiti i record, quindi dipenderà dall'implementazione.

Senza indici sulla tabella, l'ordine ragionevole sarebbe l'ordine in cui sono stati inseriti i record. Con una chiave primaria definita, l'ordine ragionevole sarebbe l'ordine della chiave primaria. Ma dal momento che la specifica ANSI non richiede un ordine specifico, dipende dal venditore e la loro sensibilità potrebbe essere diversa dalla tua o dalla mia.

Poiché l'ordine è non indicato nella specifica, non è saggio fare affidamento sul comportamento dell'implementazione di un particolare fornitore, poiché può variare da un fornitore all'altro e il venditore può cambiare ordina ogni volta che desiderano, senza preavviso.

Come hai detto, includi semplicemente la clausola ORDER BY , se l'ordine è importante.

    
risposta data 09.08.2013 - 23:36
fonte
2

Ovviamente sottolineando che la specifica non dice quale ordine i dati arrivano, non ha funzionato. Probabilmente perché conosce i dati si trovano su un disco o in memoria da qualche parte e quindi lo hanno come ordine. Chiedigli qual è l'ordine dei dati calcolati da più tabelle. Cioè crea un esempio in cui ti unisci a 4 tabelle, esegui un calcolo su 2 di esse e restituisci solo il valore calcolato.

Il motore restituisce i dati nell'ordine in cui li trova (assente un ordine da), ma come li trova dipende da fattori che possono cambiare: indice, statistiche, cache. Generalmente i dati saranno in un ordine coerente, ma se dipendi dall'ordine, devi richiederlo.

    
risposta data 10.08.2013 - 19:37
fonte

Leggi altre domande sui tag