2011-12-23 11 views
5

Ho una tabella con un indice cluster PK e altri indici su di essa, sia univoci che non univoci. Se io emissione (esattamente):Ordina Ordine dei risultati per Seleziona SENZA DOVE o ORDINA PER clausola

SELECT * FROM table_name 

o

SELECT col1, col2 FROM table_name 

in quale ordine saranno le righe restituite?

Questa è la prima domanda in un questionario di intervista che un cliente ci ha inoltrato. Ecco le istruzioni:

Se la risposta a questa domanda non è corretta, interrompi immediatamente l'intervista! L'individuo, indipendentemente dall'abilità dichiarata, non comprende i sistemi di gestione dei database relazionali basati su SQL. Questa è la logica SQL-101 per gli ultimi 25 anni. La risposta corretta è: "sconosciuto/casuale/indeterminato perché non è stata specificata alcuna clausola ORDER BY come parte della query".

Sono in qualche modo non convinto che questo sia effettivamente corretto. Tutti i commenti sono benvenuti

Grazie,

Raj

risposta

8

Anche se una tabella ha una chiave primaria/indice cluster, non si può essere sicuri circa l'ordine delle righe. Sebbene nel piano di esecuzione ci sia una scansione indice/heap alla fine, se la query viene eseguita in parallelo su molti core, il set di dati risultante non verrà ordinato a causa del passaggio del piano di unione di flussi paralleli.

Probabilmente non lo vedrete su database di piccole dimensioni, ma provate a crearne uno con molti file su hard disk separati ed eseguite una semplice query su una macchina multicore. Molto probabilmente otterrai i risultati "parzialmente ordinati" per ID, vale a dire ci saranno dei blocchi in cui vengono ordinate le righe, ma i blocchi verranno recuperati in ordine semi-casuale.

+1

+1 È inoltre possibile ottenere una scansione ordinata di allocazione in alcune condizioni o SQL Server potrebbe utilizzare la funzione di scansione avanzata di scansione/giostra. [Vedi anche questa risposta] (http://stackoverflow.com/questions/7116004/guarantee-order-of-table-valued-function-results/7117186#7117186) –

5

Le istruzioni parlano a SQL a livello concettuale, in cui il risultato di una query è una relazione e le relazioni non sono ordinate. Passando dal concettuale al reale, la ragione per cui nessun ordinamento implicito è definito nello standard SQL è così che gli RDBMS sono liberi di restituire qualsiasi ordine sia più efficiente per la loro implementazione.

Problemi correlati