카테고리 보관물: Sql

sql

임시 테이블과 테이블 변수의 INSERT 성능 차이 SQL Server

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 ...')

그것이 한계를 극복하는지 확인하십시오.


답변

테이블 변수에 대한 통계가 없기 때문에 테이블 변수가 느려질 수 있으므로 옵티마이 저는 항상 하나의 레코드 만 가정합니다.

그러나 이것이 여기에 해당한다고 보장 할 수는 없습니다. 테이블 변수에 대한 쿼리 계획에서 “추정 된 행”정보를 살펴 봐야합니다.


답변