2009-10-15 4 views

답변

3

저장 프로 시저에서, 당신은 종종 내에서 데이터 세트를 저장하기위한 필요가있다 프로 시저,없이 에 해당 데이터를 필요로하는 것은 절차의 범위를 벗어나지 않습니다. 당신이 실제로 테이블 구조가 필요한 경우, 네 가지 방법이 기본적으로 할 수 있습니다 "저장"이 데이터 : 로컬 임시 테이블 (예 : #table_name), 전역 임시 테이블 (## 테이블 _), 영구 테이블 (TABLE_NAME) 및 테이블 변수 (@ 테이블 이름).

Should I use a #temp table or a @table variable?

가 tempdb에 데이터베이스 내의 물리적 테이블, 인덱스는 물리적 테이블이 .Because 임시 테이블을 생성 할 수 있습니다 로컬 및 글로벌 임시 테이블

, 당신은 또한 기본 를 만들 수 있습니다 CREATE TABLE 명령을 사용하거나 ALTER TABLE 명령을 사용하여 키를 입력하십시오. ALTER TABLE 명령을 사용하여 코드 내에 이 필요한 기본값, 새 열 또는 제약 조건을 추가 할 수 있습니다.

로컬 및 글로벌 임시 테이블과 달리 테이블 변수에는 인덱스가 생성 될 수 없습니다. 예외는 테이블 변수가 기본 키가 생성 될 때 DECLARE @variable TABLE 명령을 사용하여 정의 될 수 있다는 것입니다. 그러면 테이블 변수 에 클러스터 된 또는 클러스터되지 않은 인덱스가 만들어집니다. CREATE INDEX 명령은 테이블 변수를 인식하지 못합니다. 따라서 인덱스는 이 기본 키와 함께 나타나는 인덱스이며 테이블 변수 선언에 생성 된 인덱스입니다. 또한 테이블 변수에 대한 트랜잭션 로그가 기록되지 않습니다. 따라서 트랜잭션 메커니즘의 범위를 벗어납니다.

0

'#myTable은 제약 조건과 인덱스 등을 가질 수있는 임시 테이블이며 많은 리소스를 사용합니다.

@myTable은 하나 이상의 열이있는 것으로 정의하는 테이블 변수입니다. 그들은 적은 자원을 사용하고 당신이 그들을 사용하는 절차에 적용됩니다.

임시 테이블이 사용되는 대부분의 경우, 성능상의 이점을 제공 할 수있는 테이블 변수가 대신 사용될 수 있습니다.

1

참조하십시오

종종 tempdb에 반대로 @table 변수는 메모리에 저장되어 있다고한다; 이것은 반드시 정확하지는 않습니다.

테이블 변수에는 통계가 없으므로 특정 상황에서 성능에 영향을 줄 수 있습니다.

+0

임시 테이블은 w.r.t와 같은 방식으로 작동합니다. 메모리/디스크. 가능한 경우 메모리에서 TempDB 데이터베이스에 DDL이 너무 큰 경우 디스크에 유지됩니다. – GilaMonster

0

테이블 #tabel1은 tempdb에 저장된 로컬 임시 테이블입니다. ##table1은 tempdb에 저장된 전역 임시 테이블입니다.

@table은 테이블 변수입니다. 그들의 차이

검사에게 link

1

테이블 변수는 상대적으로 작은 데이터 세트를 처리 할 때 잘 좋은,하지만 그들은 잘 확장되지 않는다는 점을 기억해주십시오. 특히 SQL Server 2000과 SQL Server 2005 간의 동작이 변경되어 대규모 데이터 세트로 인해 성능이 저하되었습니다.

SQL Server 2000의 매우 복잡한 저장 프로 시저를 사용하여 특히 어려운 상황이었습니다. 연구 및 테스트 결과 테이블 변수를 사용하는 것이 더 효과적인 방법이었습니다. 그러나 SQL Server 2008 성능 업그레이드 후 은 상당히으로 저하되었습니다. 이전의 모든 테스트 등으로 인해 임시 테이블이 더 빠르다고 판별했기 때문에 테이블 변수를 사용하는 것이 목화를 처리하는 데 다소 시간이 걸렸습니다. 그러나 SQL Server 버전 간의 이러한 변경으로 인해 이제는 정반대 였고 중요한 리팩토링에 이어 두 자릿수의 시간이 완료되어 몇 분 안에 완료되기 시작했습니다.

그래서 어떤 것이 가장 좋은지에 대한 확실한 답은 없습니다. 상황을 평가하고, 자신의 테스트를 수행하고, 결과를 토대로 결정을 내려야합니다. 그리고 항상 서버 업그레이드 후에 다시 평가하십시오. , 별도의 노트에 임시 테이블의 세 번째 유형도 있다는 것을 인식 - ## XYZ가 : http://www.sql-server-performance.com/articles/per/temp_tables_vs_variables_p1.aspx

업데이트 -

더 자세한 정보 및 샘플 타이밍은이 문서를 참조하십시오. 이들은 모든 SQL Server 연결에서 전역 적이며 볼 수 있으며 일반 임시 테이블과 같이 현재 연결 범위가 아닙니다. 그것들은 그것에 접근하는 마지막 연결이 닫힐 때에 만 떨어 뜨린다.

관련 문제