Ordinamento multiplo è uno strumento fondamentale nella creazione di report quando è necessario classificare o raggruppare i dati in base a più colonne (ad esempio, prima per data, poi per nome, poi per somma). Tradizionalmente, l'ordinamento veniva eseguito esclusivamente su un singolo campo, il che non risolve le necessità di analisi dei dati complessi.
Il problema spesso riguarda l'ordine di ordinamento errato (ad esempio, i valori NULL si trovano in posizioni inaspettate), gli errori di collation (diverse regole linguistiche per l'ordinamento dei valori di stringa) e cali di prestazione su grandi insiemi di dati.
Soluzione: Utilizzare l'ORDER BY multi-colonna, considerare la specificità della COLLATION e definire esplicitamente l'ordine dei NULL per la determinazione del risultato, oltre a verificare l'indicizzazione delle colonne per tabelle di grandi dimensioni.
Esempio di codice:
SELECT * FROM sales ORDER BY region COLLATE "ru_RU", date DESC NULLS LAST, total_amount DESC;
Caratteristiche chiave:
Se non si indica la COLLATE, l'ordinamento sarà sempre lo stesso su diversi server?
No! La COLLATE di default dipende dalle impostazioni del database e/o del server, e i risultati dell'ordinamento delle stringhe (specialmente con caratteri cirillici, caratteri speciali) possono variare tra le installazioni.
Dove vengono posizionati i NULL durante l'ordinamento DESC e ASC?
Lo standard SQL non definisce questo in modo chiaro. In alcuni DBMS, i NULL vengono posti in cima durante l'ASC, in altri in fondo. Indica esplicitamente NULLS FIRST o NULLS LAST per rendere il comportamento trasparente.
ORDER BY price DESC NULLS LAST
Influisce l'ORDER BY su più colonne sull'uso dell'indice?
Sì, ma solo se l'ordine, i tipi e la pulizia dei valori delle colonne corrispondono all'indice composito esistente. Se l'ordine è misto (ASC/DESC) o si utilizzano campi calcolati, l'indice potrebbe non essere utilizzato.
Il manager ha creato un report con ORDER BY per cognome senza COLLATE. Durante il trasferimento del report tra diversi server, i cognomi russi e latini cambiavano posizione, e i NULL erano alternativamente in cima o in fondo.
Vantaggi:
Nel report è stata esplicitamente definita la COLLATE e l'ordine dei NULL tramite NULLS FIRST/LAST, è stato aggiunto un indice composito sui campi di ordinamento. Il comportamento ha smesso di dipendere dall'ambiente, la velocità della query è notevolmente aumentata.
Vantaggi: