2017-11-29 2 views
1

에 비해에서 (선택)와 하위 쿼리입니다. (예 : 600 문자열). 내가 경로의이 목록을 사용하고왜이 같은 쿼리를 빠르게 ('XX', 'XX'..)

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

와 다른 요청 나중에 수행 할 때

이 30 초 이상 걸릴 수 있습니다.

내가이 쿼리를 수행 할 때 :

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

그것은 1 초 미만이 걸릴.

SQL Server가 쿼리를 수행하고 Join을 수행합니까?

this post의 경우 왜 JOIN을 사용하여 쿼리를 변경 하시겠습니까?

+2

게일 쇼 (Gail Shaw)는이 주제에 대해 훌륭한 기사를 갖고 있습니다. https://www.sqlinthewild.co.za/index.php/2010/01/12/in-vs-inner-join/ –

답변

1

나는 이유가 꽤 간단하다고 생각한다. (그리고 나는 코멘트에 언급 된 기사가 이것을 언급하고 있는지 확신 할 수 없다.)

SQL Server는 in 상수 목록을 순차적으로 검색합니다. 즉, 목록의 모든 값이 일치하지 않으면 모든 값을 비교해야합니다. 다른 데이터베이스는 목록을 정렬하고 이진 검색을 수행하여이를 최적화합니다.

한편, 하위 쿼리가있는 in은 인덱스를 사용할 수 있습니다.이 인덱스는 기본적으로 이진 검색입니다. 이는 특히 목록에없는 값의 경우 계산이 크게 감소 할 수 있습니다.

1

질의 실행 플랜에 따라, IN (여러 값) 갖는다 고 '선택 선정'INNER 동일한 방법 (인덱스 스캔을 사용IN (선택 ..) 일 가입)을 선택 비용이 낮습니다.

감사합니다.

관련 문제