이 연결 항목 의 예제 코드
어디에 버그를 보여줍니다
SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item
올바른 결과를 반환합니다. 그러나 다음은 잘못된 결과를 반환합니다 (2014 년 새로운 카디널리티 추정기를 사용하여)
SELECT
(SELECT COUNT(*)
FROM dbo.my_splitter_1('2') L1
INNER JOIN dbo.my_splitter_1('') L2
ON L1.csv_item = L2.csv_item)
L2에 대한 결과를 공통 하위 표현식 스풀에 잘못로드하면 L1 결과에 대한 결과를 재생합니다.
두 쿼리의 동작이 왜 다른지 궁금합니다. 추적 플래그 8675는 작동 search(0) - transaction processing
하는 것과 실패한 것이 들어간 것을 보여줍니다 search(1) - quick plan
.
따라서 추가 변환 규칙의 가용성이 동작의 차이 뒤에 있다고 가정합니다 ( 예 : BuildGbApply 또는 GenGbApplySimple을 사용 하지 않도록 설정하면 수정).
그러나 이러한 매우 유사한 쿼리에 대한 두 계획에서 서로 다른 최적화 단계가 발생하는 이유는 무엇입니까? 내가 읽은 것에서 search (0)
적어도 3 개의 테이블이 필요하며 그 조건은 첫 번째 예에서 확실히 충족되지 않습니다.