39

クエリで集計が行われていないのに、なぜ誰かがgroupbyとdistinctを使用するのでしょうか。

また、MySQLとSQLServerのパフォーマンスに関する個別の考慮事項と比較してgroupbyを知っている人はいますか。SQL Serverの方が優れたオプティマイザーを備えており、同等のものに近いかもしれませんが、MySQLでは、パフォーマンスが大幅に向上することを期待しています。

dbaの回答に興味があります。

編集:

ビルの投稿は興味深いものですが、当てはまりません。具体的に...

select a, b, c 
from table x
group by a, b,c

select distinct a,b,c
from table x
4

5 に答える 5

29

GROUP BY特定の列の個別の値ごとに、行のグループを1つの行にマップします。これは、必ずしも選択リストに含まれている必要はありません。

SELECT b, c, d FROM table1 GROUP BY a;

このクエリは正当なSQLです(修正: MySQLのみ。実際には標準SQLではなく、他のブランドではサポートされていません)。MySQLはそれを受け入れ、あなたが何をしているのかを知っていることを信頼し、、を選択しb、それらはの機能依存性であるため、明確な方法で。 cda

ただし、Microsoft SQL Serverおよびその他のブランドでは、機能の依存関係を簡単に判断できないため、このクエリは許可されていません。 編集:代わりに、標準SQLでは、単一値ルールに従う必要があります。つまり、選択リストのすべての列は、GROUP BY句で名前を付けるか、集合関数の引数にする必要があります。

一方DISTINCT、選択リスト内のすべての列と、それらの列のみを常に確認します。DISTINCTこれは、列を指定できる一般的な誤解です。

SELECT DISTINCT(a), b, c FROM table1;

括弧DISTINCTは関数呼び出しのように見えますが、そうではありません。これはクエリオプションであり、選択リストの3つのフィールドのいずれかに個別の値があると、クエリ結果に個別の行が表示されます。この選択リストの式の1つには括弧が付いていますが、これは結果に影響しません。

于 2009-01-09T02:48:44.607 に答える
18

私たちのDBからのいくつかのランダムなテーブルに関する、MS SQL Serverからの小さな(非常に小さな)経験的データ。

パターンの場合:

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 は確かに両方を同じように扱います。

于 2009-01-09T04:22:40.050 に答える
3

MySQL では、GROUP BY を使用すると DISTINCT よりもパフォーマンスが向上することがよくあります。

「EXPLAIN SELECT DISTINCT」を実行すると、「Using where; Using temporary」が表示されます。MySQL は一時テーブルを作成します。

vs a "EXPLAIN SELECT a,b, c from T1, T2 where T2.A=T1.A GROUP BY a" は "Using where" を表示するだけです

于 2011-06-30T11:13:15.450 に答える
2

どちらもMS SQL Serverで同じクエリプランを生成します....MS SQL Serverを使用している場合は、実際の実行プランを有効にして、どちらがニーズに適しているかを確認できます...

それらの投稿をご覧ください:

http://blog.sqlauthority.com/2007/03/29/sql-server-difference-between-distinct-and-group-by-distinct-vs-group-by/

http://www.sqlmag.com/Article/ArticleID/24282/sql_server_24282.html

于 2009-01-09T01:42:08.813 に答える
0

本当に個別の値を探している場合は、個別によってソースコードが読みやすくなります(ストアドプロシージャの一部である場合など)。アドホッククエリを作成する場合は、通常、groupbyから始めます。私はしばしばそれらを置くことになるので、集約はありません。

于 2009-01-09T03:27:48.147 に答える