2010-10-11 10 views
7

Sono sconcertato da una query in Oracle che sta tornando in un ordine apparentemente casuale.Perché Oracle restituisce una sequenza specifica se i valori di "orderby" sono identici?

SELECT 
    Date, 
    Amount 
FROM MyTable 
WHERE Date = '26-OCT-2010' 
ORDER BY Date 

Ciò restituisce i seguenti dati:

| Date  | Amount 
-------------------------- 
1 | 26-OCT-10 | 85 
2 | 26-OCT-10 | 9 
3 | 26-OCT-10 | 100 

Non riesco a capire il motivo per cui il database restituisce i dati in questo ordine specifico, o perché, dal momento che la tabella originale sarebbe restituire i dati in questo modo.

Casting Date a TIMESTAMP conferma che tutte Date valori sono lo stesso valore - 26-OCT-10 00.00.00.000000000, pertanto, può escludere che v'è una differenza nei valori. Tuttavia, quando faccio questo, le righe ritornano nell'ordine di 1, 3, 2.

Questo mi sta facendo impazzire quindi mi aiuterebbe davvero a calmarmi se qualcuno potesse fornire una spiegazione sul perché questo sia.

Mi aspetto che questo venga restituito in un ordine diverso ogni volta che viene eseguita la query, dato che l'ordine condizionale è identico su ogni riga (lasciando così l'ordine alla pura casualità).

Molte grazie in anticipo.

risposta

10

L'ordinamento non è fino a "puro caso" - a meno che non emendare la query:

SELECT 
    Date, 
    Amount 
FROM MyTable 
WHERE Date = '26-OCT-2010' 
ORDER BY Date, DBMS_RANDOM.VALUE; 

L'ordine è "arbitrario". Piuttosto che "lanciare i dadi" per decidere l'ordine arbitrario (che comporterebbe un costo inutile), Oracle restituisce semplicemente i dati nell'ordine in cui li ha incontrati, il che probabilmente è lo stesso da eseguire a correre a breve termine. (A lungo termine, qualcosa potrebbe cambiare nell'ambiente per rendere l'ordinamento diverso, ma comunque arbitrario).

+0

Grazie per la spiegazione! Ho pensato che potesse semplicemente "ritornare" all'ordine incontrato, come SQL Server, ma non ne ero così sicuro. Grazie ancora! –

-1

Suoni come Oracle utilizza un algoritmo di ordinamento stable per l'ordinamento.

+0

Grazie per il collegamento! –

+2

Citazione necessaria. I documenti Oracle non dichiarano che i risultati sono definiti quando si ordinano due valori identici. http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_10002.htm # SQLRF01702 –

+1

Jeffrey è corretto: l'ordine può sembrare stabile, ma in realtà è abbastanza possibile che l'ordine cambi, ad esempio se un indice viene aggiunto alla tabella. –

2

Mentre io non so nulla sull'implementazione di Oracle, se tutte le cose sono uguali, in priori, allora non saranno in un ordine casuale: metterle in ordine casuale richiederebbe ogni ordine di randomizzare lì, (quali sarebbero n operazioni randomizzanti, dove n è il numero di elementi (usando la notazione O grande sarebbe O (n)), che è una cosa computazionalmente costosa, se la query restituirebbe Huge (milioni) di risultati

restituito dalla query

v'è alcuna necessità per loro di essere randomizzati in questo modo ,.

invece solo li restituisce in (quello che sto indovinando è) l'ordine in cui sono memorizzati su disco

2

Leggi this nice piece dal blog di Tom Kyte per quanto riguarda l'ordinazione.

Quando si dice che le righe ritornano in "1,3,2", l'ordine dovrebbe essere ordinato dalle colonne che dicono che è in 1,3,2 per risolverlo.

Problemi correlati