group by句では列の順序は重要ですか?


85

カーディナリティが非常に高い列とカーディナリティが非常に低い列(一意の値の数)の2つの列がある場合、どの順序でグループ化するかは重要ですか?

次に例を示します。

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

それが重要な状況はありますか?


2
および関連記事を参照してください。グループのMYSQL5順序によって...
trcarden

回答:


74

いいえ、GROUPBY句の順序は重要ではありません。

MySQLとSQLiteは、グループから省略されている列を選択できる(非標準、移植性がない)唯一のデータベースですが、順序も重要ではありません。


27

SQLは宣言型です。

この場合、オプティマイザーにデータをどのようにグループ化するかを伝え、それを行う方法を決定します。

行ごとに評価せず(手続き型)、最初に1つの列を確認します

列の順序が重要な主な場所はインデックスです。col1, col2と同じではありませんcol2, col1。まったく。


15
ORDERBYにとっても重要です。
ヴィンセント・マクナブ2014年

12

ROLLUPと呼ばれるMicrosoftSQLServerのレガシーの非標準機能があります。ROLLUPはGROUPBY構文の拡張であり、これを使用すると、GROUP BY列の順序によって、結果でグループ化する列が決まります。ただし、ROLLUPは非推奨です。標準のSQLの代替手段は、SQL Server2008以降のバージョンでサポートされているグループ化セットを使用することです。


10

これはここでは言及されていないので。上記の答えは正しいです。つまり、「group by」句の後の列の順序は、クエリの正確さ(つまり合計金額)に影響しません。

ただし、取得される行の順序は、「groupby」句の後に指定された列の順序によって異なります。たとえばA、次の行を持つテーブルについて考えてみます。

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

SELECT *, SUM(Col3) FROM A GROUP BY Col2, Col1Col2昇順で並べられた行を取得します。

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

ここで、groupbyの列の順序をに変更しCol1, Col2ます。取得された行は、昇順で並べ替えられCol1ます。

すなわち 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

注:合計量(つまり、クエリの正確さ)はまったく同じままです。


7
しかし、「ORDER BY」を使用しない限り、選択結果の行順はとにかく定義されていませんね。したがって、GROUP BYをまったく使用していなくても、特定の行の順序に依存しないでください。
avl_sweden

@avl_swedenに同意すると、応答は少なくともこの動作が実装固有であることを示す必要があると思います。新しい(または同じ)バージョンのSQLサーバーが異なる順序を生成しないという保証はありません。
NobodysNightmare

2

カーディナリティが非常に高い列とカーディナリティが非常に低い列(一意の値の数)の2つの列がある場合、どの順序でグループ化するかは重要ですか?

クエリ-1

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

クエリ-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;

どちらも同じで、groupby句では順序が機能しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.