クエリで集計が行われていないのに、なぜ別のグループと別のグループを使用するのですか?
また、誰かがMySQLとSQL Serverの明確なパフォーマンスの考慮事項と比較してグループを知っていますか。 SQL Serverにはより優れたオプティマイザがあり、同等のオプティマイザがあると思いますが、MySQLでは、パフォーマンスが大幅に向上することを期待しています。
私はdbaの答えに興味があります。
編集:
ビルの投稿は興味深いですが、該当しません。もっと具体的にさせて...
select a, b, c
from table x
group by a, b,c
versus
select distinct a,b,c
from table x
MS SQL Serverからの少し(非常に少し)の経験的データ、DBからのいくつかのランダムなテーブル。
パターンについて:
SELECT col1, col2 FROM table GROUP BY col1, col2
そして
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
は、specific列の個別の値ごとに、行のグループを1行にマップします。これは、必ずしも選択リストにある必要はありません。
SELECT b, c, d FROM table1 GROUP BY a;
このクエリは正しいSQLです(修正: MySQLのみ。実際には標準SQLではなく、他のブランドではサポートされていません)。 MySQLはそれを受け入れ、b
、c
、およびd
を明白な方法で選択することで、あなたが何をしているかを知っていると信頼します 関数の依存関係 of a
。
ただし、Microsoft SQL Serverや他のブランドでは、機能的な依存関係を簡単に判別できないため、このクエリは許可されていません。 編集:代わりに、標準SQLでは単一値ルールに従う必要があります。つまり、選択リストのすべての列はGROUP BY
句またはセット関数の引数。
一方、DISTINCT
は常に選択リストのすべての列を調べ、それらの列のみを調べます。 DISTINCT
では列を指定できるというのはよくある誤解です。
SELECT DISTINCT(a), b, c FROM table1;
括弧がDISTINCT
を関数呼び出しのように見せているにもかかわらず、そうではありません。これはクエリオプションであり、選択リストの3つのフィールドのいずれかの個別の値は、クエリ結果の個別の行につながります。この選択リストの式の1つに括弧が付いていますが、これは結果には影響しません。
MySQLでは、GROUP BYを使用するとDISTINCTよりもパフォーマンスが向上することがよくあります。
「EXPLAIN SELECT DISTINCT」を実行すると、「場所の使用;一時の使用」が表示されます。MySQLは一時テーブルを作成します。
vs "EXPLAIN SELECT a、b、c from T1、T2 where T2.A = T1.A GROUP BY a"は単に "Using where"を示しています
どちらもMS SQL Serverで同じクエリプランを生成します。MSSQL Serverがある場合は、実際の実行プランを有効にして、どちらがニーズに適しているかを確認できます...
これらの投稿をご覧ください。
http://www.sqlmag.com/Article/ArticleID/24282/sql_server_24282.html
実際に個別の値を探している場合は、その個別のコードによってソースコードが読みやすくなります(ストアドプロシージャの一部である場合など)。アドホッククエリを作成している場合は、私はしばしばそれらを置くことになるので、集約はありません。