2017-04-18 11 views
0

本で提供される相関サブクエリの例は、次のとおりです。 2月12日に発注し特定のコードのサブクエリと相関サブクエリの相違点

お客様、2007

SELECT custid, companyname 
FROM Sales.Customers AS C 
WHERE EXISTS 
    (SELECT * 
    FROM Sales.Orders AS O 
    WHERE O.custid = C.custid 
    AND O.orderdate = '20070212'); 

しかし、私は、どちらも同じ出力を与える簡単なサブクエリ

SELECT custid, companyname 
FROM Sales.Customers 
WHERE custid IN 
    (SELECT [custid] FROM [Sales].[Orders] 
    WHERE [orderdate] ='20070212') 

を使用して、同じ目的のために、次のコードを書きました。どの方法が良いですか?なぜ?そして私は、私はSQL Server上で自分のデータに類似したクエリを試してみました

+1

ここでは、使用しているSQL Serverのバージョンによってパフォーマンスが異なる場合があります(http://stackoverflow.com/questions/2065329/sql-server-in-vs-exists-performance)。 回答とコメントで読めるように、2008年現在、オプティマイザはINとEXISTSの両方を同等に扱います。 –

+0

EXISTSはSELECTが行を返し、EXISTSがTRUEと評価された場合はFALSEに評価され、SELECTが評価されます。 最も効率的な方法が最適かもしれません;)何が異なるかを知るには、クエリの実行計画を検討する必要があります。同じ実行計画を得ている可能性があります。これは、2つのクエリが実質的に同一であることを意味します。 –

答えて

1

コードの第1のセットでここEXISTSの使用を理解していない2016 SP!:実行計画で

select 
* 
from EXT.dbo_CUSTTABLE 
where ACCOUNTNUM in 
(select CUSTACCOUNT from EXT.dbo_SALESLINE b 
    where b.CREATEDDATETIME between '20170101 00:00' and '20170102 23:59'); 

select 
* 
from EXT.dbo_CUSTTABLE a 
where exists 
(select * from EXT.dbo_SALESLINE b 
    where a.ACCOUNTNUM=b.CUSTACCOUNT 
    and b.CREATEDDATETIME between '20170101 00:00' and '20170102 23:59'); 

見て、彼らがしています同一!

enter image description here

私は顧客テーブルにクラスタ化インデックス、およびsaleslineにインデックスを追加した場合、我々はインデックスで、より効率的なクエリを取得し、追求し、内部には参加し、テーブルスキャンの代わりにとハッシュ結合それでも同じ!:

enter image description here

今、あなたはバージョン間のクエリオプティマイザが変化するため、youreの結果は変更される場合がありますSQL Serverの別のバージョンを使用している場合。

関連する問題