129

次のうちどれがより効率的でしょうか?

INSQL Serverが結果セットを大きなIFステートメントに変えると信じているので、私は常に使用について少し慎重でした。結果セットが大きい場合、パフォーマンスが低下する可能性があります。結果セットが小さい場合は、どちらが望ましいかわかりません。大きな結果セットの場合、EXISTSより効率的ではないでしょうか?

WHERE EXISTS (SELECT * FROM Base WHERE bx.BoxID = Base.BoxID AND [Rank] = 2)

対。

WHERE bx.BoxID IN (SELECT BoxID FROM Base WHERE [Rank = 2])
4

9 に答える 9

156

EXISTSエンジンがヒットを検出すると、条件が真であることが証明されたため、エンジンは検索を終了するため、より高速になります。

を使用INすると、さらに処理する前に、サブクエリからすべての結果が収集されます。

于 2010-01-14T15:53:04.923 に答える
39

SQL Server 2005 と 2008 でいくつかのテストを行いましたが、EXISTS と IN の両方で、他の人が述べているように、まったく同じ実際の実行計画が返されました。オプティマイザーが最適です。:)

ただし、EXISTS、IN、および JOIN は、クエリを正しく表現しないと、異なる結果を返す場合があることに注意してください。 .aspx

于 2010-08-11T16:08:58.447 に答える
8

私はINを介してEXISTSを使用します。以下のリンクを参照してください。

SQL Server:JOIN vs INvsEXISTS-論理的な違い

返される結果に関して、INはEXISTSまたはJOINと同等に動作するという一般的な誤解があります。これは単に真実ではありません。

IN:指定された値がサブクエリまたはリストのいずれかの値と一致する場合にtrueを返します。

存在:サブクエリに行が含まれている場合はtrueを返します。

結合:結合列で2つの結果セットを結合します。

ブログクレジット:https ://stackoverflow.com/users/31345/mladen-prajdic

于 2010-01-14T15:51:07.890 に答える
6

ここには、非常に支持されたものを含め、誤解を招く回答がたくさんあります(ただし、彼らの操作が害を意味するとは思いません)。簡単に言えば、これらは同じです。

(T-)SQL 言語には多くのキーワードがありますが、最終的にハードウェアで実際に発生するのは、実行クエリ プランに見られる操作だけです。

[NOT] IN呼び出すときに行うリレーショナル (数学理論) 操作[NOT] EXISTSは、準結合 ( を使用する場合の逆結合NOT) です。対応する sql-server 操作が同じ名前であることは偶然ではありません。INまたはどこにも言及する操作はありませんEXISTS-(反)半結合のみです。したがって、論理的に同等のINvsEXISTS選択がパフォーマンスに影響を与える可能性はありません。これは、結果を取得する唯一の方法である (アンチ) セミ結合実行操作があるためです。

例:

クエリ 1 (計画)

select * from dt where dt.customer in (select c.code from customer c where c.active=0)

クエリ 2 (計画)

select * from dt where exists (select 1 from customer c where c.code=dt.customer and c.active=0)
于 2018-12-04T14:31:53.820 に答える
3

The execution plans are typically going to be identical in these cases, but until you see how the optimizer factors in all the other aspects of indexes etc., you really will never know.

于 2010-01-14T15:54:00.507 に答える
3

したがって、IN は EXISTS と同じではなく、同じ実行計画も生成されません。

通常、EXISTS は相関サブクエリで使用されます。つまり、EXISTS 内部クエリを外部クエリと結合します。外部クエリ結合と内部クエリ結合を解決する必要があるため、結果を生成するための手順がさらに追加され、それらの where 句が一致して両方が結合されます。

通常、IN は内側のクエリを外側のクエリと関連付けずに使用され、1 つのステップで解決できます (最良のシナリオ)。

このことを考慮:

  1. IN を使用し、内部クエリの結果が数百万行の個別の値である場合、EXISTS クエリが高性能である (外部クエリと結合するための適切なインデックスがある) 場合、おそらく EXISTS よりも遅く実行されます。

  2. EXISTS を使用し、外部クエリとの結合が複雑な場合 (実行に時間がかかり、適切なインデックスがない)、外部テーブルの行数によってクエリが遅くなり、完了までの推定時間が数日かかる場合があります。指定されたハードウェアで行数が許容できる場合、またはデータのカーディナリティが正しい場合 (たとえば、大規模なデータ セットで DISTINCT 値が少ない場合)、IN は EXISTS よりも高速に実行できます。

  3. 上記のすべては、各テーブルにかなりの量の行がある場合に注目されます (公正とは、CPU 処理および/またはキャッシュの RAM しきい値を超えるものを意味します)。

したがって、答えは依存します。IN または EXISTS 内に複雑なクエリを記述できますが、経験則として、多数の異なる値を持つ行が多数ある場合は、限られた一連の個別の値で IN を使用し、EXISTS を使用するようにしてください。

秘訣は、スキャンする行数を制限することです。

よろしく、

マリアーノC

于 2018-05-17T17:55:59.063 に答える
-1

頭のてっぺんから外れていて、正しいとは限りません。この場合、2番目の方が速くなると思います。

  1. 最初に、相関サブクエリにより、各行に対してサブクエリが実行される可能性があります。
  2. 2番目の例では、相関関係がないため、サブクエリは1回だけ実行する必要があります。
  3. 2番目の例でINは、一致するものが見つかるとすぐに短絡します。
于 2010-01-14T15:48:34.257 に答える