2017-02-13 1 views
1

동일한 데이터를 반환하는 쿼리가 두 개 있습니다. 정상 Query1을가 가입SQL Server 쿼리 성능 - 일반 조인 대 하위 쿼리

실행하는 데 시간이 오래 걸리는 :

SELECT TOP 1000 bigtable.*, tbl1.name, tb2.name FROM 
bigtable INNER JOIN tbl1 on bigtable.id1 = tbl1.id1 AND 
INNER JOIN tbl2 on tbl1.id1 = tbl2.id1 

위해 bigtable.id 내림차순으로

하위 쿼리를 사용

QUERY2은 상당히 빨리 반환

SELECT subtable.*, tbl1.name, tb2.name FROM 
(SELECT TOP 1000 FROM bigtable) subtable 
INNER JOIN tbl1 on subtable.id1 = tbl1.id1 AND 
INNER JOIN tbl2 on tbl1.id1 = tbl2.id1 
order by subtable.id desc 

bigtable에는 100,000 개의 행이 있습니다. tbl1은 매우 작은 테이블입니다 (10 행 미만). 하위 쿼리를 사용하지 않을 것입니다. order by 절을 건너 뛰면 두 쿼리가 모두 빠르게 실행됩니다. ID에 DESC 인덱스를 추가하여 조인중인 필드에 인덱스를 추가하려고 시도했지만 아무것도 도움이되지 않습니다.

도움을 주시면 감사하겠습니다.

===> 업데이트 :

이 내용은 중요하지 않습니다. 동일한 행을 가진 tbl1과 비슷한 다른 테이블을 생성 한 후에 Query1이 복사 된 테이블과 함께 두 번째로 실행되었음을 발견했습니다. tbl1에 재건 된 통계가 수정되었습니다.

답변

0

나는 두 개의 쿼리가 동일하지라고 생각 - 나는 비싼 작업이 이제 두 버전 모두에 존재하는 큰 테이블의 순서 될 것으로 기대

SELECT subtable.*, tbl1.name, tb2.name FROM 
(SELECT TOP 1000 FROM bigtable order by bigtable.id desc) subtable 
INNER JOIN tbl1 on subtable.id1 = tbl1.id1 AND 
INNER JOIN tbl2 on tbl1.id1 = tbl2.id1 
order by subtable.id desc 

로 두 번째를 작성하려고합니다.

+0

첫 번째 항목을 더 빠르게 만들려고합니다. 즉 하위 쿼리를 최적화하려고하지 않습니다. – Hari

+0

그러나 두 개의 쿼리가 실제로 동일하지 않다는 사실을 놓쳤습니다. 첫 번째 레코드는 100,000 개의 레코드를 주문한 후 상위 1000 개의 레코드를 선택합니다. ** 이것이 더 비싼 이유입니다. 두 번째 것은 쓴대로 큰 테이블에서 ** 주문하지 않고 상위 1000 개의 레코드를 선택합니다 ** 물론 이것은 매우 저렴한 연산이며 작은 테이블로 결과를 조인 한 다음 1000 개의 레코드를 주문합니다. 하위 쿼리를 최적화하기 위해 다시 작성했지만 첫 번째 쿼리와 동일하게 만듭니다. 내가 맞다면 JOIN 성능을 수정 된 하위 쿼리와 비교해야합니다. –

+0

그런데 내 게시물에 오타가있는 것을 발견 한 경우 하위 쿼리에는 "order by bigtable.id"가 포함되어야하며 "order by subtable.id"는 포함되지 않아야합니다. 그에 따라 내 대답을 편집했습니다. –