Si j'ai deux colonnes, une avec une cardinalité très élevée et une avec une cardinalité très faible (nombre unique de valeurs), est-ce que l'ordre dans lequel je groupe est important?
Voici un exemple:
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
Y a-t-il des situations où cela compte?
Non, l'ordre n'a pas d'importance pour la clause GROUP BY.
À ma connaissance, MySQL et SQLite sont les seules bases de données qui vous permettent de sélectionner des colonnes omises du groupe (non standard, non portable), mais l'ordre n'a pas d'importance.
SQL est déclaratif.
Dans ce cas, vous avez indiqué à l’optimiseur comment vous souhaitez regrouper les données et comment procéder.
Il n'évaluera pas ligne par ligne (procédure) et examinera d'abord une colonne.
L'ordre des colonnes de la place principale est important pour les index. col1, col2
n'est pas la même chose que col2, col1
. Du tout.
Il existe une fonctionnalité héritée non standard de Microsoft SQL Server appelée ROLLUP. ROLLUP est une extension de la syntaxe GROUP BY et lorsqu'il est utilisé, l'ordre des colonnes GROUP BY détermine les colonnes à regrouper dans le résultat. ROLLUP est cependant déconseillé. L'alternative SQL standard consiste à utiliser des ensembles de regroupement, pris en charge par SQL Server 2008 et les versions ultérieures.
Depuis cela n'a pas été mentionné ici. Les réponses ci-dessus sont correctes, c'est-à-dire que l'ordre des colonnes après la clause "group by" n'affectera pas le correctness de la requête (c'est-à-dire le montant total).
Cependant, l'ordre des lignes extraites variera en fonction de l'ordre des colonnes spécifié après la clause "group by". Par exemple, considérons la table A
avec les lignes suivantes:
Col1 Col2 Col3
1 xyz 100
2 abc 200
3 xyz 300
3 xyz 400
SELECT *, SUM(Col3) FROM A GROUP BY Col2, Col1
récupérera les lignes ordonnées par le Col2
par ordre croissant.
Col1 Col2 Col3 sum(Col3)
2 abc 200 200
1 xyz 100 100
3 xyz 300 700
Maintenant, changez l'ordre de la colonne dans le groupe par Col1, Col2
. Les lignes récupérées sont ordonnées asc par Col1
.
c'est-à-dire 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
Remarque: le montant de la somme (c'est-à-dire l'exactitude de la requête) reste identique.
Si j'ai deux colonnes, une avec une cardinalité très élevée et une avec une cardinalité très faible (nombre unique de valeurs), est-ce que l'ordre dans lequel je groupe est important?
Requête-1
SELECT spec_id, catid, spec_display_value, COUNT(*) AS cnt FROM tbl_product_spec
GROUP BY spec_id, catid, spec_display_value ;
Requête-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;
Les deux sont égaux, l'ordre ne fonctionne pas dans la clause group by.