sql group by vs distinct
-
06-07-2019 - |
質問
クエリで集計が行われないのに、なぜグループを個別に使用するのか、個別に使用するのですか?
また、MySQLとSQL Serverのパフォーマンスに関する個別の考慮事項に対して、誰かがグループを知っていますか? SQL Serverにはより優れたオプティマイザーがあり、同等のオプティマイザーに近いと思われますが、MySQLでは、パフォーマンスが大幅に向上することを期待しています。
dbaの回答に興味があります。
編集:
Billの投稿は興味深いですが、適用できません。もっと具体的に...
select a, b, c
from table x
group by a, b,c
対
select distinct a,b,c
from table x
解決
MS SQL Serverからのわずかな(非常に少ない)経験的データ、DBからのいくつかのランダムテーブル。
パターンの場合:
SELECT col1, col2 FROM table GROUP BY col1, col2
and
SELECT DISTINCT col1, col2 FROM table
クエリのカバーインデックスがない場合、どちらの方法でも次のクエリプランが作成されました。
|--Sort(DISTINCT ORDER BY:([table].[col1] ASC, [table].[col2] ASC))
|--Clustered Index Scan(OBJECT:([db].[dbo].[table].[IX_some_index]))
およびカバーリングインデックスがあった場合、両方が生成されます:
|--Stream Aggregate(GROUP BY:([table].[col1], [table].[col2]))
|--Index Scan(OBJECT:([db].[dbo].[table].[IX_some_index]), ORDERED FORWARD)
その非常に小さなサンプルSQL Serverからは、確かに両方が同じものとして扱われます。
他のヒント
GROUP BY
は、特定の列の個別の値ごとに行のグループを1行にマップします。これらは必ずしも選択リストにある必要はありません。
SELECT b, c, d FROM table1 GROUP BY a;
このクエリは正当なSQLです(MySQLでのみ修正:。実際には標準SQLではなく、他のブランドではサポートされていません)。 MySQLはそれを受け入れ、あなたが何をしているのかを知っていることを信頼し、 b
、 c
、および d
を明確に選択します。 ' a
の機能の依存関係です。
ただし、Microsoft SQL Serverやその他のブランドでは、このクエリを許可していません。機能の依存関係を簡単に判断できないためです。 編集:代わりに、標準SQLでは、単一値ルールに従う必要があります。つまり、選択リストのすべての列は、 GROUP BY
句、またはset関数の引数になります。
一方、 DISTINCT
は常に、選択リスト内のすべての列を調べ、それらの列のみを調べます。 DISTINCT
を使用して列を指定できるという誤解はよくあります:
SELECT DISTINCT(a), b, c FROM table1;
括弧は DISTINCT
を関数呼び出しのように見せますが、そうではありません。これはクエリオプションであり、select-listの3つのフィールドのいずれかの個別の値は、クエリ結果の個別の行につながります。この選択リストの式の1つには括弧がありますが、これは結果に影響しません。
MySQLでは、多くの場合、DISTINCTよりもGROUP BYを使用した方がパフォーマンスが向上します。
" EXPLAIN SELECT DISTINCT"の実行" Using where;を示しています一時的な" MySQLは一時テーブルを作成します。
vs「EXPLAIN SELECT a、b、c from T1、T2 where T2.A = T1.A GROUP BY a」」 「使用場所」を表示するだけです;
どちらもMS SQL Serverで同じクエリプランを生成します。...MS SQL Serverを使用している場合は、実際の実行プランを有効にして、どちらがニーズに適しているかを確認できます...
これらの投稿をご覧ください:
http://www.sqlmag.com/Article/ArticleID/24282 /sql_server_24282.html
個別の値を本当に探している場合、個別の値によりソースコードが読みやすくなります(ストアドプロシージャの一部である場合など)。アドホッククエリを作成する場合は、通常、集約することが多いため、集約がない場合。