SQL Server 2005에는 다음과 같은 문제가 있습니다. 테이블 변수에 일부 행을 삽입하려고하면 임시 테이블을 사용하는 동일한 삽입에 비해 많은 시간이 걸립니다.
이것은 테이블 변수에 삽입하는 코드입니다
DECLARE @Data TABLE(...)
INSERT INTO @DATA( ... )
SELECT ..
FROM ...
임시 테이블에 삽입 할 코드입니다.
CREATE #Data TABLE(...)
INSERT INTO #DATA( ... )
SELECT ..
FROM ...
DROP TABLE #Data
임시 테이블에는 키 또는 인덱스가 없으며 선택 부분은 두 쿼리간에 동일하며 선택에 의해 반환되는 결과 수는 ~ 10000 행입니다. 선택 만 실행하는 데 필요한 시간은 ~ 10 초입니다.
임시 테이블 버전을 실행하는 데 최대 10 초가 걸리므로 5 분 후에 테이블 변수 버전을 중지해야했습니다.
쿼리가 테이블 값 함수의 일부이기 때문에 테이블 변수를 사용해야합니다. 이는 임시 테이블에 대한 액세스를 허용하지 않습니다.
테이블 변수 버전의 실행 계획
임시 테이블 버전의 실행 계획
답변
두 계획의 명백한 차이점은 빠른 계획은 평행하고 느린 계획은 느리다는 것입니다.
이것은 테이블 변수에 삽입되는 계획의 제한 사항 중 하나입니다. 의견에서 언급했듯이 (그리고 원하는 효과가있는 것처럼 보입니다) 시도해 볼 수 있습니다
INSERT INTO @DATA ( ... )
EXEC('SELECT .. FROM ...')
그것이 한계를 극복하는지 확인하십시오.
답변
테이블 변수에 대한 통계가 없기 때문에 테이블 변수가 느려질 수 있으므로 옵티마이 저는 항상 하나의 레코드 만 가정합니다.
그러나 이것이 여기에 해당한다고 보장 할 수는 없습니다. 테이블 변수에 대한 쿼리 계획에서 “추정 된 행”정보를 살펴 봐야합니다.