2010-06-17 14 views
54

Se ho due colonne, una con cardinalità molto alta e una con cardinalità molto bassa (numero di valori univoco), ha importanza in quale ordine raggruppo per?L'ordine delle colonne è importante in una clausola group by?

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?

+1

Vedere anche il post correlato: [Ordine MYSQL5 di gruppo per ...] (http://stackoverflow.com/questions/1095645/mysql-5-does-it-matter-what-order-my-group- by-fields-are-in) – trcarden

risposta

49

No, l'ordine non è rilevante per la clausola GROUP BY.

MySQL e SQLite sono gli unici database di cui sono a conoscenza che consentono di selezionare le colonne che vengono omesse dal gruppo (non standard, non portatili) ma l'ordine non importa neanche lì.

20

SQL è dichiarativo.

In questo caso, è stato detto all'ottimizzatore come si desidera raggruppare i dati e come farlo.

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

Le principali questioni di ordine del posto delle colonne è per gli indici. col1, col2 non corrisponde a col2, col1. Affatto.

+5

È importante anche per ORDER BY. –

10

C'è una funzione legacy, non standard di Microsoft SQL Server, chiamata ROLLUP. ROLLUP è un'estensione della sintassi GROUP BY e quando viene utilizzato l'ordine delle colonne GROUP BY determina quali colonne devono essere raggruppate nel risultato. ROLLUP è tuttavia obsoleto. L'alternativa standard SQL consiste nell'utilizzare i gruppi di gruppi, supportato da SQL Server 2008 e versioni successive.

4

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 (ad esempio l'importo totale).

Tuttavia, l'ordine delle righe da recuperare varia in base all'ordine delle colonne specificato dopo la clausola "gruppo per". Ad esempio si consideri Tabella A con 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, Col1 sarà recuperare righe ordinati dal Col2 in ordine crescente.

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

Ora cambiare l'ordine delle colonne nel gruppo da a Col1, Col2. Le righe recuperate sono ordinate asc per 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: La quantità sommatoria (cioè la correttezza della query) rimane esattamente la stessa.

+0

ora è quello che stavo cercando .. grazie –

0

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

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 group by.

Problemi correlati