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


12

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 분 후에 테이블 변수 버전을 중지해야했습니다.

쿼리가 테이블 값 함수의 일부이기 때문에 테이블 변수를 사용해야합니다. 이는 임시 테이블에 대한 액세스를 허용하지 않습니다.

테이블 변수 버전의 실행 계획 실행 계획

임시 테이블 버전의 실행 계획 실행 계획

답변:


8

두 계획의 명백한 차이점은 빠른 계획은 평행하고 느린 계획은 느리다는 것입니다.

이것은 테이블 변수에 삽입되는 계획의 제한 사항 중 하나입니다. 의견에서 언급했듯이 (그리고 원하는 효과가있는 것처럼 보입니다) 시도해 볼 수 있습니다

INSERT INTO @DATA ( ... ) 
EXEC('SELECT .. FROM ...')

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


난 당신이 사용할 수 없다고하지만하지만 그것은 좋은 제안했다 EXEC.... 함수에 내가 잘못 생각
Lamak

1
@Lamak-도! 이렇게하면 OP에서 작동하지 않습니다. Invalid use of a side-effecting operator 'INSERT EXEC' within a function.. 그러나 OPENQUERY해결 방법 이 효과가 있을 수 있습니다.
마틴 스미스

아, 감사합니다. 설명을 주셔서 감사합니다
Lamak

2
일반적으로 큰 데이터 집합이 반환 될 것으로 예상되는 경우 테이블 변수를 사용하지 않으려 고합니다. 이 경우 임시 테이블이 일반적으로 더 빠릅니다.
HLGEM

1
@munissor, 테이블 값 함수를 사용하지 마십시오. 더 나은 조언을 원한다면 지금하고있는 일을 정확하게 게시하십시오.
HLGEM

-1

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

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


이것이 테이블 변수에 대한 삽입에 어떤 영향을 미칩니 까?
Martin Smith

병렬 및 직렬뿐만 아니라 해시 및 중첩 루프 조인 사이에도 차이가 있음을 알 수 있듯이 옵티마이 저는 테이블 변수가 하나의 레코드를 보유하므로 결과는 다음과 같습니다. 또한 쿼리의 각 부분에 대한 실제 통계를 보는 것임을 증명할 수있는 유일한 방법은 쿼리 중 하나의 레코드 일 뿐이지 만 테이블 변수와 관련된 모든 쿼리는 루프 조인 및 직렬 처리로 끝납니다. 그래서 여기에 의심되는 것이 공정합니다
yoel halb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.