동일한 데이터를 반환하는 쿼리가 두 개 있습니다. 정상 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에 재건 된 통계가 수정되었습니다.
첫 번째 항목을 더 빠르게 만들려고합니다. 즉 하위 쿼리를 최적화하려고하지 않습니다. – Hari
그러나 두 개의 쿼리가 실제로 동일하지 않다는 사실을 놓쳤습니다. 첫 번째 레코드는 100,000 개의 레코드를 주문한 후 상위 1000 개의 레코드를 선택합니다. ** 이것이 더 비싼 이유입니다. 두 번째 것은 쓴대로 큰 테이블에서 ** 주문하지 않고 상위 1000 개의 레코드를 선택합니다 ** 물론 이것은 매우 저렴한 연산이며 작은 테이블로 결과를 조인 한 다음 1000 개의 레코드를 주문합니다. 하위 쿼리를 최적화하기 위해 다시 작성했지만 첫 번째 쿼리와 동일하게 만듭니다. 내가 맞다면 JOIN 성능을 수정 된 하위 쿼리와 비교해야합니다. –
그런데 내 게시물에 오타가있는 것을 발견 한 경우 하위 쿼리에는 "order by bigtable.id"가 포함되어야하며 "order by subtable.id"는 포함되지 않아야합니다. 그에 따라 내 대답을 편집했습니다. –