L'ordine delle colonne è importante in una clausola group by?


85

Se ho due colonne, una con cardinalità molto alta e una con cardinalità molto bassa (numero univoco di valori), è importante in quale ordine raggruppo?

Ecco un esempio:

select 
     dimensionName, 
     dimensionCategory, 
     sum(someFact)
from SomeFact f
join SomeDim d on f.dimensionKey = d.dimensionKey
group by 
    d.dimensionName,  -- large number of unique values
    d.dimensionCategory -- small number of unique values

Ci sono situazioni in cui è importante?


2
Vedi anche il post correlato: MYSQL5 order of group by ...
trcarden

Risposte:


74

No, l'ordine non ha importanza per la clausola GROUP BY.

MySQL e SQLite sono gli unici database di cui sono a conoscenza che ti consentono di selezionare le colonne che sono omesse dal gruppo da (non standard, non portabili) ma l'ordine non ha importanza neanche lì.


27

SQL è dichiarativo.

In questo caso, hai detto all'ottimizzatore in che modo desideri raggruppare i dati e questo ha capito come farlo.

Non valuterà riga per riga (procedurale) e guarderà prima una colonna

La questione principale dell'ordine delle colonne è per gli indici. col1, col2non è lo stesso di col2, col1. Affatto.


15
È importante anche per ORDER BY.
Vincent McNabb

12

Esiste una funzionalità legacy non standard di Microsoft SQL Server chiamata ROLLUP. ROLLUP è un'estensione della sintassi GROUP BY e quando viene utilizzata l'ordine delle colonne GROUP BY determina quali colonne devono essere raggruppate nel risultato. ROLLUP è tuttavia deprecato. L'alternativa SQL standard consiste nell'utilizzare i set di raggruppamento, che è supportato da SQL Server 2008 e versioni successive.


10

Poiché questo non è stato menzionato qui. Le risposte di cui sopra sono corrette, ovvero l'ordine delle colonne dopo la clausola "group by" non influirà sulla correttezza della query (ovvero l'importo della somma).

Tuttavia, l'ordine delle righe da recuperare varierà in base all'ordine delle colonne specificate dopo la clausola "group by". Ad esempio, considera la tabella Acon le seguenti righe:

Col1 Col2 Col3
1   xyz 100
2   abc 200
3   xyz 300
3   xyz 400

SELECT *, SUM(Col3) FROM A GROUP BY Col2, Col1recupererà le righe ordinate da Col2in ordine crescente.

Col1 Col2 Col3 sum(Col3)
2   abc 200 200
1   xyz 100 100
3   xyz 300 700

Ora cambia l'ordine della colonna nel gruppo da a Col1, Col2. Le righe recuperate vengono ordinate in base a Col1.

cioè select *, sum(Col3) from A group by Col1, Col2

Col1 Col2 Col3 sum(Col3)
1   xyz 100 100
2   abc 200 200
3   xyz 300 700

Nota: l'importo della somma (ovvero la correttezza della query) rimane esattamente lo stesso.


7
Ma, a meno che non venga utilizzato un "ORDER BY", l'ordine delle righe dei risultati di selezione è comunque indefinito, non è vero? Quindi non dovresti mai fare affidamento su un particolare ordine di righe, anche se non usi affatto GROUP BY.
avl_sweden

Accettando @avl_sweden, penso che la risposta dovrebbe almeno indicare che questo comportamento è specifico dell'implementazione. Non vi è alcuna garanzia che una versione più recente (o addirittura la stessa) di SQL Server non produrrà un ordine diverso.
NobodysNightmare

2

Se ho due colonne, una con cardinalità molto alta e una con cardinalità molto bassa (numero univoco di valori), è importante in quale ordine raggruppo?

Query-1

SELECT spec_id, catid, spec_display_value, COUNT(*) AS cnt  FROM tbl_product_spec 
GROUP BY spec_id, catid, spec_display_value ;

Query-2

SELECT spec_id, catid, spec_display_value, COUNT(*) AS cnt  FROM tbl_product_spec FORCE INDEX(idx_comp_spec_cnt)
GROUP BY catid, spec_id,spec_display_value;

Entrambi sono uguali, l'ordine non funziona in gruppo per clausola.

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.