검색 값을 바꿀 때 성능이 심각하게 저하되는 이중 자체 조인 쿼리가 있습니다. "XYZ"검색 값의 순서에 따라 SQL 쿼리 성능이 저하됩니다.
-- 500,000 i/o & 500ms execution
select
fooA.ID
, fooB.ID
from
foo AS fooA
INNER JOIN bar AS barA ON fooA.barID = barA.barID
INNER JOIN foo AS fooB ON fooA.fooID = fooB.fooID -- self join
INNER JOIN bar AS barB ON fooB.barID = barB.barID
where
barA.value = 'xyz'
AND barB.value = '60'
-- 5,000 i/o & 5ms execution
select
fooA.ID
, fooB.ID
from
foo AS fooA
INNER JOIN bar AS barA ON fooA.barID = barA.barID
INNER JOIN foo AS fooB ON fooA.fooID = fooB.fooID -- self join
INNER JOIN bar AS barB ON fooB.barID = barB.barID
where
barA.value = '60'
AND barB.value = 'xyz'
- 값은 "줄"테이블에 15 만 번 나열됩니다.
- 값 "60"은 "막대"테이블에 500 번 나열됩니다.
- 첫 번째 나열된 검색 값에 따라 가장 안쪽 루프가 150,000 행 또는 500 행을 반환한다는 점을 제외하면 쿼리 계획은 동일합니다.
- 검색은 클러스터되지 않은 인덱스에 대한 검색을 수행합니다.
- FULLSCAN을 사용하여 두 테이블의 통계를 모두 업데이트했습니다.
SQL 쿼리 최적화 프로그램이 두 인스턴스 모두에서 쿼리 계획의 가장 안쪽에있는 조인이 최소한의 행 집합이어야한다는 것을 올바르게 식별하지 않는 이유는 무엇입니까?
쿼리의 행 수를 항상 가장 먼저 제한하는 조건을 사용하십시오. 그것의 일반적인 어림짐작. – JonH
가능한 답 : 쿼리 매개 변수화, 매개 변수 스니핑 및 계획 재사용. –
id 테이블을 foo 및 bar 테이블에 기본 키로 만들 수 있습니까? –