2012-01-30 1 views
5

임시 테이블을 작성하기 위해 tempdb을 사용하는 프로 시저가 저장되어 있다고 가정하면 더 나은 성능을 얻기 위해 테이블 ​​변수로 전환하는 것이 더 좋을까요?테이블 변수를 임시 테이블보다 빠르게 사용하고 있습니까

+1

임시 테이블에 몇 개의 레코드가 있는지, 테이블 변수와 같은 서버 구성은 tempdb에 푸시 될 수 있습니다. http://blogs.msdn.com/b/sqlserverstorageengine/archive/2008/03/30/sql-server-table-variable-vs-local-temporary-table.aspx – Kane

+0

데이터가 다양하지만 좋은 지적입니다. . 테이블 변수가 소량의 데이터로 더 많은 성능을 발휘한다면, 이것을 전환 할 것입니다. –

+0

[SQL Server의 임시 테이블과 테이블 변수의 차이점은 무엇입니까?] (http://stackoverflow.com/questions/27894/whats-the-difference-between-a-temp-table-and-table -variable-in-sql-server) 또는 this : http : // stackoverflow.com/questions/6991511/sql-server-temp-table-vs-table-variable 및 아마도 – gbn

답변

1

임시 테이블이 성능면에서 우수합니다. 테이블 변수를 사용하고 변수의 데이터가 너무 커지면 SQL Server는 변수를 자동으로 임시 테이블로 변환합니다.

거의 모든 데이터베이스 관련 질문과 마찬가지로 수행하려는 작업에 따라 다릅니다. 따라서 더 많은 정보 없이는 대답하기가 어렵습니다.

내 대답은 시도하고 실행 계획을 살펴보십시오. 최저 비용으로 가장 빠른 방법을 사용하십시오.

+0

상단에있는 내 의견이 의미가 있으며 전환해야합니까? –

+0

말하기 어렵거나 전환하기가 어렵습니다. 테이블 변수를 반환하고 작업이 두 가지 방법 모두에서 빠르다면 예, 전환 할 것입니다. 당신은 정말로 그것을 시도해야합니다. 예를 들어, 지난 주 나는 매우 느린 쿼리를 최적화했습니다. 20 시간 전에, 지금 2 분. 테이블 변수에서 임시 테이블로 변경되었습니다. 반환 된 데이터는 크지 않고 2000 행 이었지만 많은 연산과 필터가있었습니다. – dknaack

+3

"테이블 변수를 사용하고 변수의 데이터가 너무 커지면 SQL Server는 변수를 자동으로 임시 테이블로 변환합니다." 이 진술은 전적으로 거짓입니다. –

1

오브젝트는 메모리에 있기 때문에 적은 "설정 시간"이 같은 @Table이 빠를 수 있습니다.

@ 테이블에는 많은 어획량이 있습니다.

@Table에 기본 키를 설정할 수 있지만 그에 대한 기본 키를 가질 수 있습니다. 다른 색인 열 조합을 위해 클러스터되지 않은 클러스터되지 않음.

또한 테이블에 실제 데이터 볼륨 (약 200 개 이상, 아마도 1000 개 행)이 포함되는 경우 테이블 액세스가 느려집니다. 특히 유용한 인덱스가 없을 때 특히 그렇습니다.

# 테이블은 디버깅 할 때 떨어 뜨릴 필요가 있으므로 procs에 고통이 있습니다. 작성하는 데 오랜 시간이 걸립니다. 인덱스를 두 번째 단계로 추가해야하므로 설치 시간이 오래 걸립니다. 그러나 많은 양의 데이터가 있으면 매번 #tables가 있습니다.

테이블에 100 행 미만의 데이터가있는 경우에도 테이블에 유용한 인덱스를 만들 수 있으므로 여전히 # 테이블을 사용할 수 있습니다.

요약하면 간단한 proc 등을 할 때 대부분 @ 시간을 사용합니다.하지만 수행해야 할 것은 # 테이블이어야합니다.

+0

필자는 최근에이 쿼리를 사용하여 (같은 매개 변수를 사용하여 여러 번 테스트 한) 동일한 쿼리 (5 초 후에 반환 된)와 # TempTable'은'@ TableVar'를 사용하여 16 초입니다. – Jason

0

@ 테이블에는 통계가 없으므로 실행 계획에 더 많은 추측이 필요합니다. 따라서 1000-ish 행의 권장 상한선. # 테이블에는 통계가 있지만 호출 간에는 can be cached입니다. 카디널리티가 SP가 실행될 때마다 크게 다른 경우 매번 REBUILDRECOMPILE이 필요합니다. 이것은 물론 오버 헤드이지만, 쓰레기 계획의 비용과 균형을 맞추어야합니다.

두 유형 모두 IO to TempDB입니다.

아니, @ 테이블은 만병 통치약이 아닙니다.