몇 가지 테이블을 조인하고 꽤 나쁘게 수행하는 쿼리가 있습니다. 행 추정이 (1000 번) 떨어져 있고 중첩 루프 조인이 선택되어 여러 테이블 스캔이 발생합니다. 쿼리의 모양은 다음과 같이 매우 간단합니다.
SELECT t1.id
FROM t1
INNER JOIN t2 ON t1.id = t2.t1_id
LEFT OUTER JOIN t3 ON t2.id = t3.t2_id
LEFT OUTER JOIN t4 ON t3.t4_id = t4.id
WHERE t4.id = some_GUID
쿼리를 사용하여 조인 중 하나에 병합 조인을 사용하도록 힌트를 주면 여러 번 더 빠르게 실행됩니다. 이해할 수 있습니다-병합 조인은 조인 된 데이터에 대한 더 나은 옵션이지만 SQL Server는 Nested Loops를 올바르게 선택하는 것으로 추정하지 않습니다.
내가 완전히 이해하지 못하는 것은 왜이 조인 힌트가 모든 계획 운영자에 대한 모든 추정치를 변경합니까? 다른 기사와 서적을 읽음으로써 계획이 작성되기 전에 카디널리티 추정이 수행된다고 가정했기 때문에 힌트를 사용해도 추정이 변경되지 않고 SQL Server에 명시 적으로 특정 물리적 조인 구현을 사용하도록 지시합니다.
그러나 내가 보는 것은 병합 힌트로 인해 모든 추정이 거의 완벽해진다는 것입니다. 통계가 분명히이를 허용한다는 점을 고려할 때 이런 일이 발생하는 이유는 무엇입니까?
UPD : 익명 실행 계획은 여기에서 찾을 수 있습니다 : https://www.dropbox.com/s/hchfuru35qqj89s/merge_join.sqlplan?dl=0 https://www.dropbox.com/s/38sjtv0t7vjjfdp/no_hints_join.sqlplan?dl = 0
TF 3604, 9292 및 9204를 사용하여 두 쿼리에서 사용되는 통계를 확인했으며 동일한 통계입니다. 그러나 검색 / 검색된 인덱스는 쿼리마다 다릅니다.
그 외에도 쿼리를 OPTION (FORCE ORDER)
실행하여 병합 조인을 사용하는 것보다 훨씬 빠르게 실행하여 모든 조인에 대해 HASH MATCH를 선택했습니다.