2017-04-18 8 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 서버에 내 자신의 데이터에 유사한 쿼리를 시도

+1

여기서 읽을 수 있습니다 (http://stackoverflow.com/questions/2065329/sql-server-in-vs-exists-performance), 사용중인 SQL Server 버전에 따라 성능이 다를 수 있습니다. 답과 의견에서 읽을 수 있듯이 2008 년 현재 옵티마이 저는 IN과 EXISTS를 동일하게 취급합니다. –

+0

EXISTS는 select가 행을 반환하면 EXISTS가 TRUE로 평가되고 그렇지 않으면 FALSE로 평가됩니다. 가장 효율적일 수있는 방법이 가장 좋습니다.) 다르게 수행 된 작업을 확인하려면 쿼리 실행 계획을 연구해야합니다. 동일한 실행 계획을 얻는 것이 좋을 수도 있습니다. 이는 두 쿼리가 동일하다는 것을 의미합니다. –

답변

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'); 

봐, 그들이있다 같은! 나는 고객 테이블에 클러스터 된 인덱스 및 salesline에 인덱스를 추가하는 경우

enter image description here

, 우리는 인덱스를 추구하고 내부 해시 조인 테이블 스캔과 대신에, 결합,보다 효율적인 쿼리를 얻을 하지만 여전히 동일합니다! :

enter image description here

이제 버전 사이의 쿼리 최적화 변경 때문에, 개봉 된 결과는 다를 수 있습니다 SQL 서버의 다른 버전을 사용하는 경우.