최근 에이 문제를 발견했으며 온라인에서 토론을 찾을 수 없습니다.
아래 쿼리
DECLARE @S VARCHAR(1) = '';
WITH T
AS (SELECT name + @S AS name2,
*
FROM master..spt_values)
SELECT *
FROM T T1
INNER JOIN T T2
ON T1.name2 = T2.name2;
항상 중첩 루프 계획을 얻습니다.
문제 INNER HASH JOIN
또는 INNER MERGE JOIN
힌트 를 강제로 적용하려고 하면 다음 오류가 발생합니다.
이 쿼리에 정의 된 힌트로 인해 쿼리 프로세서가 쿼리 계획을 생성 할 수 없습니다. 힌트를 지정하지 않고 SET FORCEPLAN을 사용하지 않고 쿼리를 다시 제출하십시오.
변수를 집계로 래핑하여 해시 또는 병합 조인을 사용할 수있는 해결 방법을 찾았습니다. 생성 된 계획은 훨씬 저렴합니다 (19.2025 vs 0.261987).
DECLARE @S2 VARCHAR(1) = '';
WITH T
AS (SELECT name + (SELECT MAX(@S2)) AS name2,
*
FROM spt_values)
SELECT *
FROM T T1
INNER JOIN T T2
ON T1.name2 = T2.name2;
이 행동의 이유는 무엇입니까? 내가 찾은 것보다 더 나은 해결 방법이 있습니까? (아마도 추가 실행 계획 분기가 필요하지 않음)