14

次の2つのクエリでは、まったく同じ結果が得られます。

select country, count(organization) as N
from ismember
group by country
having N > 50;

select * from (
  select country, count(organization) as N
  from ismember
  group by country) x
where N > 50;

HAVINGすべての句をサブクエリとこのような句に置き換えることはできますWHEREか?HAVINGまたは、条項が絶対に必要/より強力/より効率的/何でもある状況はありますか?

4

6 に答える 6

11

ここで2つの質問があります。最初の質問に対する答えは「はい」です。HAVING-ladenクエリの結果セットは、サブクエリとして実行された同じクエリの結果セットと同じであり、WHERE句で装飾されています。

2番目の質問は、パフォーマンスと表現度についてです。ここでは、実装について詳しく説明します。MySQLには細い赤い線があり、パフォーマンスがバラバラになり始めます。内部クエリの結果セットをメモリに保持できなくなった瞬間。この場合、MySQLは内部クエリのディスク上表現を作成し、その上でWHEREセレクターを使用します。これは発生しません。HAVING句が使用されている場合、失格となったグループは結果セットから削除されます。

これは、HAVING句の選択性が高いほど、パフォーマンスの関連性が高くなることを意味します。内部クエリの100万行の結果セットを検討します。これは、HAVING句によって5行に削減されます。結果セットは非常に可能性が高いです。内部クエリのはメモリに保持されませんが、最終的な結果セットが保持される可能性が非常に高くなります。

編集

私はこれを一度持っていました:クエリは非常に均等に分散されたテーブルからいくつかの外れ値を選択しました(1日あたりのワークショップで物理マシンで生成されたピースの数)。IO負荷が高いため調査しました。

編集2

クエリキャッシュはサブクエリには使用されないことに注意してください-私見では、場所の開発はもっと焦点を当てる必要があります-サブクエリパターンは、キャッシュされた結果セットである内部クエリから利益を得ることはありません。

于 2012-08-25T10:32:19.110 に答える
9

Sql Server 2008では、2つの類似したクエリの実行プランはまったく同じです。

ここに画像の説明を入力してください

また、Entity Framework(SS 2008を使用)によって生成された多くのクエリについても調査しましたが、これまでのところ、HAVING句を含むクエリは見たことがありません。集計結果を条件とするクエリをグループ化すると、常にサブクエリを含むクエリに変換されます。ADO.Netチームが彼らがやっていることを知っていると私は信じています...

于 2012-08-25T10:41:04.063 に答える
4

HAVING句は、サブクエリの複雑さを回避するのに非常に役立ちます。ただし、この2つは論理的に同等であり、すべてのHAVING句は、サブクエリを使用して書き換えることができます。

興味がある場合は、GROUP BYを極端に使用する準備ができていれば、すべてのWHERE句をHAVING句として記述することもできます。

于 2012-08-25T10:34:23.713 に答える
1

一般的なものからMySQLに変更したことは知っていますが、ここに(役立つかもしれない)メモを追加したいと思います。少し変更を加えて、SQLServer2008でクエリを試しました。

詳細を知りたい人のために、2つのクエリの実行計画はSQL Server 2008でもまったく同じです。したがって、オプティマイザーは2つのコマンドを同じ方法で同じパフォーマンスと見積もりで処理します。

于 2012-08-25T10:41:22.520 に答える
0

HAVING2番目のケースでは、グループ化された結果を含むワークテーブルに追加のパスがあり、その上にフィルタリング基準が実行されるため、この句を使用すると効率的です。

于 2012-08-25T10:27:11.733 に答える
0

論理的にはそうです、結果は最終的に同じになります。ただし、パフォーマンスは異なる場合があります。HAVING句を使用すると、DBが別の実行プランを変更する可能性があります。

上記の人へのメモ(どういうわけか直接コメントすることはできません)-実行計画はクエリに依存するだけではありません。また、実行時のテーブルサイズなどの統計に応じて、DBによって調整される場合があります。少なくともDB2についてはそうです...

于 2012-08-25T14:36:11.833 に答える