DB2 ordina i dati tramite la chiave primaria


8

Di recente ho avuto una discussione con un collega che stava spingendo per rimuovere le clausole order by da una query di produzione perché l'ordine per colonna era lo stesso della chiave primaria .

Dopo una lunga discussione in cui ho cercato di spiegare che non può garantire l'ordinamento basato sulla chiave primaria, la conclusione finale è stata che non avrebbe spinto per la modifica delle query MSSQL.
Ma avrebbe comunque cambiato le query DB2.

Non sono riuscito a trovare immediatamente un articolo che smentisse che DB2 ordinava le query con la chiave primaria e attualmente mi chiedo se lo faccia o meno.

Quindi la mia domanda è: in che modo DB2 ordina una query se non esiste una clausola order by? Utilizza la chiave primaria?
Come si può garantire che i dati vengano emessi correttamente, senza una clausola order by, in un sistema parallelo?

Risposte:


18

No, il tuo collega ha torto.

Tutti i prorodotti SQL - DBMS che si comportano secondo gli standard SQL - non forniscono alcuna garanzia che il risultato di un output della query verrà ordinato in alcun modo, a meno che non ci sia una ORDER BYclausola nella query .

Come menzionano i documenti IBM DB2 :

L'ordinamento viene eseguito in conformità con le regole di confronto descritte in Elementi del linguaggio. Il valore null è superiore a tutti gli altri valori. Se la specifica dell'ordine non determina un ordine completo, le righe con valori duplicati dell'ultima chiave di ordinamento identificata hanno un ordine arbitrario. Se non si specifica ORDER BY, le righe della tabella dei risultati hanno un ordine arbitrario.


"Se si comportano secondo gli standard SQL" è un grande se ... IBM documenta FTW.
WernerCD,

@WernerCD Nessun DBMS è conforme al 100% con lo standard (e ce ne sono molte versioni.) Ma sostengono di essere conforme a molte parti. Mi aspetto di avere almeno dove differiscono, documentato.
ypercubeᵀᴹ

Sì, ecco perché ero +1 per i documenti IBM rispetto a "Standard". "Atteso" vs "Attuale" può, e sicuramente lo farà, mordere nel cisterna.
WernerCD,

11

Come è stato sottolineato nella risposta di ypercube, quando non esiste una ORDER BYclausola non esiste un ordine definito .

Quello che vorrei aggiungere è che è importante rendersi conto che SQL è molto un'astrazione, non specifica passo dopo passo cosa deve fare il DBMS ma specifica piuttosto i requisiti del risultato finale.

Ciò implica che se i dati sono già stati cercati in modo da garantire l'ordine corretto, ciò è dovuto al fatto che il DBMS ha deciso tale strategia e saprà già che non è necessario alcun lavoro di ordinamento aggiuntivo per soddisfare i requisiti della ORDER BYclausola .

D'altra parte, se non specifichi che l'ordine è significativo per te (anche se in realtà lo è?), Il DBMS ne terrà conto e se trova una strategia diversa che è più efficiente per trovare i dati giusti in un altro ordine trarrà vantaggio dal fatto che apparentemente non ti importava dell'ordine. (La strategia scelta potrebbe anche cambiare nel tempo, in base alla crescente quantità di dati nelle relative tabelle, patch software, ecc.)

Vale a dire, la rimozione della ORDER BYclausola ha pochissimo vantaggio (dimensione della query leggermente più piccola) ma potenzialmente enorme svantaggio se l'ordine è effettivamente importante. Soprattutto, poiché questo potrebbe benissimo funzionare con il set di dati di test e superare i test di accettazione solo per causare seri problemi lungo la linea.


1
Il motivo che ha indicato nel suo foglio di distribuzione è che "Ordinare per sta occupando risorse della CPU, mentre l'ordine è già implicito dalla chiave primaria". Il che mi è sembrato molto sbagliato (come dimostrato dalle risposte finora)
Reagisce il

@Reaces DB2 utilizza le tabelle 'heap' per impostazione predefinita o è più simile a SQL Server con indici cluster? Non cambia la risposta, ma potrebbe rendere più facile dimostrarlo :)
Jack dice di provare topanswers.xyz il

@Jack Douglas, il clustering in SQL Server e DB2 sono concetti diversi. Ho imparato molto riguardo al clustering in SQL Server in questo thread: groups.google.com/d/msg/comp.databases.ms-sqlserver/P7Wcs4NcF4s/… . Se hai familiarità con SQL Server ma non con DB2 potresti voler dare un'occhiata.
Lennart,

Le tabelle @Reaces in DB2 sono in genere "raggruppate" sulla chiave primaria per impostazione predefinita, a meno che non sia specificato un indice di clustering.
Chris Aldrich,

1
@ChrisAldrich - questa affermazione è vera solo per DB2 su z / OS.
Mustaccio,
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.