2017-11-29 3 views
1

に比べて(選択)を持つサブクエリです。 (たとえば、600文字列)。は、なぜ私はこのようなクエリを持っているより速く(「XX」、「XX」..)

私は、パスのこのリストを使用して、それが30秒以上かかることがあります

Select * 
From FOLDER 
WHERE FOLDER.PATH IN ('path1','path2' [...]) 

と、後で別の要求を行います。

私はこのクエリを実行すると:

Select * 
From FOLDER 
WHERE 
FOLDER.PATH IN (Select PATH 
    from FOLDER 
    where 
    ...) 

それは1秒未満を取ります。

SQL Serverはクエリを実行して参加しますか?

なぜ、this postでJOINを使用してクエリを変更することをお勧めしますか?

+2

ゲイル・ショーは、このトピックに関する優れた記事を持っています。 https://www.sqlinthewild.co.za/index.php/2010/01/12/in-vs-inner-join/ –

答えて

1

私は理由がかなり簡単だと思います(そして、コメントに記載された記事がこれに対処しているかどうかはわかりません)。

SQL Serverは、定数付きのinリストのシーケンシャル検索を実行します。つまり、リスト内の値が一致しない場合、すべての値を比較する必要があります。他のいくつかのデータベースは、リストをソートしてバイナリ検索を行うことでこれを最適化します。

一方、サブクエリを持つinでは、インデックスを利用することができます。これは本質的にバイナリ検索です。これは、特にリストにない値の場合、計算量が大幅に減少する可能性があります。

1

クエリ実行プランによると、IN(複数の値があり、高い '選択コスト'、INNERは同じようには(インデックス・スキャンを使用していますIN(選択...作業に参加します)を選択コストが低い。

ありがとうございました。

関連する問題