web-dev-qa-db-ja.com

SQLグループ別または個別

クエリで集計が行われていないのに、なぜ別のグループと別のグループを使用するのですか?

また、誰かが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
38
mson

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では、どちらも同じように扱われます。

18
Cowan

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

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

このクエリは正しいSQLです(修正: MySQLのみ。実際には標準SQLではなく、他のブランドではサポートされていません)。 MySQLはそれを受け入れ、bc、およびdを明白な方法で選択することで、あなたが何をしているかを知っていると信頼します 関数の依存関係 of a

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

一方、DISTINCTは常に選択リストのすべての列を調べ、それらの列のみを調べます。 DISTINCTでは列を指定できるというのはよくある誤解です。

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

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

29
Bill Karwin

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"を示しています

3
karl

どちらもMS SQL Serverで同じクエリプランを生成します。MSSQL 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

2
Andre Gallo

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

0
Booji Boy