web-dev-qa-db-fra.com

L'ordre des colonnes est-il important dans une clause group by?

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?

63
Jeff Meatball Yang

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.

56
OMG Ponies

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.

21
gbn

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.

10
nvogel

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.

5
AaCodes

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.

0
Gauravk