다음 (단순화 된) CTE를 실험했습니다. 테이블 변수()를 사용하면 쿼리가 취소되기 전에 몇 분 동안 쿼리가 실행됩니다. 다른 주석 처리 된 메소드는 모두 1 초 이내에 반환됩니다.공통 테이블 테이블 변수를 사용할 때 표현식이 느립니다.
전체 WHERE 절을 INNER JOIN으로 바꾸면 빠릅니다.
테이블 변수를 사용하는 것이 왜 그렇게 천천히 실행됩니까?
FWIW : 데이터베이스에 250 만 개의 레코드가 있고 내부 쿼리가 2 개의 레코드를 반환합니다.
CREATE TABLE #rootTempTable (RootID int PRIMARY KEY)
INSERT INTO #rootTempTable VALUES (1360);
DECLARE @rootTableVar TABLE (RootID int PRIMARY KEY);
INSERT INTO @rootTableVar VALUES (1360);
WITH My_CTE AS
(
SELECT ROW_NUMBER() OVER(ORDER BY d.DocumentID) rownum, d.DocumentID, d.Title
FROM [Document] d
WHERE d.LocationID IN
(
SELECT LocationID
FROM Location
JOIN @rootTableVar rtv ON Location.RootID = rtv.RootID -- VERY SLOW!
--JOIN #rootTempTable tt ON Location.RootID = tt.RootID -- Fast
--JOIN (SELECT 1360 as RootID) AS rt ON Location.RootID = rt.RootID -- Fast
--WHERE RootID = 1360 -- Fast
)
)
SELECT * FROM My_CTE WHERE (rownum > 0) AND (rownum <= 100) ORDER BY rownum
이것은 테이블 변수를 사용할 때입니다. https://docs.google.com/open?id=0B66I-fxlyEtEZEthV3ZaWlNLWXM
테이블 변수 : https://docs.google.com/open?id=0B66I-fxlyEtEbUFZa3RJejFCTkk
테이블 변수 및 임시 테이블 버전에 대한 쿼리 계획을 게시하십시오. – RBarryYoung
이것은 실제로 테이블 변수 내에서 기본 키를 본 처음입니다. 나는 궁금하다. 실행 계획은 무엇을 말해야 하는가? –
테이블 변수 버전이 완료 될 때까지 보자 : 17m 41s. 실행 계획에 대해 원하는 특정 형식? BTW - 기본 키는 제가 차이를 만들 것인지 여부를 확인하기 위해 함께 놀고 있었던 것입니다. 그것은 보이지 않았다. –