INF: 질문과 대답 - SQL Server 2000 - 테이블 변수

기술 자료 ID : 305977
마지막 검토 : 2006년 11월 20일 월요일
수정 : 5.0

요약

이 문서에서는 SQL Server 2000에 소개된 테이블 변수와 관련된 질문과 대답(FAQ) 몇 가지를 제공합니다.

테이블 변수에 대한 SQL Server 온라인 설명서의 설명을 보려면 다음 Microsoft 웹 사이트를 방문하십시오.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_ta-tz_7ysl.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_ta-tz_7ysl.asp)

추가 정보

질문 1: 임시 테이블을 이미 사용할 수 있는데 테이블 변수를 소개한 이유는 무엇입니까?

대답 1: 테이블 변수는 임시 테이블에 비해 다음과 같은 장점이 있습니다.
SQL Server 온라인 설명서의 "테이블" 문서에서 언급한 것처럼 로컬 변수 같은 테이블 변수에는 잘 정의된 범위가 있으며, 종료할 때 자동으로 정리됩니다.
테이블 변수는 임시 테이블에 비해 저장 프로시저(stored procedure)를 재컴파일하는 횟수가 적습니다.
테이블 변수가 포함된 트랜잭션은 테이블 변수의 업데이트 기간 동안만 지속됩니다. 따라서 테이블 변수에는 잠금과 로깅 리소스가 덜 필요합니다. 테이블 변수의 범위는 제한되어 있고 영구 데이터베이스의 일부가 아니기 때문에 트랜잭션 롤백의 영향을 받지 않습니다.
질문 2: 임시 테이블을 사용할 때보다 테이블 변수가 저장 프로시저를 재컴파일하는 횟수가 적다는 것은 무슨 뜻입니까?

대답 2: 다음 문서에서는 저장 프로시저를 재컴파일하는 몇 가지 이유를 설명합니다.

243586 (http://support.microsoft.com/kb/243586/) INF: 저장 프로시저(Stored Procedure) 재컴파일 문제 해결 방법
"임시 테이블 작업으로 인한 재컴파일" 절에서는 임시 테이블로 인한 재컴파일 같은 문제를 방지하는 몇 가지 요구 사항이 나열되어 있습니다. 이러한 제한은 테이블 변수에 적용되지 않습니다.

테이블 변수는 CREATE 또는 ALTER 문이 실행될 때 '재확인'이 발생하도록 만드는 배치에만 해당됩니다. 이것은 임시 테이블에 발생할 수 있습니다. 임시 테이블은 중첩된 저장 프로시저에서 테이블을 참조할 수 있도록 '재확인'할 필요가 있습니다. 테이블 변수는 저장 프로시저가 이미 컴파일된 계획을 사용할 수 있도록 이 과정을 완벽하게 피하므로 저장 프로시저를 처리할 리소스가 절약됩니다.

질문 3: 테이블 변수의 단점은 무엇입니까?

대답 3: 임시 변수와 비교하여 다음과 같은 몇 가지 단점이 있습니다.
PRIMARY 또는 UNIQUE 제약 조건을 위해 만든 시스템 인덱스 이외에 테이블 변수에는 클러스터되지 않은 색인을 만들 수 없습니다. 따라서 클러스터되지 않은 인덱스가 있는 임시 테이블과 비교할 때 쿼리 성능에 영향을 미칠 수 있습니다.
테이블 변수는 임시 테이블에서 할 수 있는 것처럼 통계를 유지하지 않습니다. 자동 만들기를 통해서나 CREATE STATISTICS 문을 사용하여 테이블 변수에 통계를 만들 수 없습니다. 따라서 큰 테이블에서 복잡한 쿼리를 수행하는 경우 통계가 없으면 최적화 프로그램이 쿼리를 위한 최적의 계획을 확인하는 것을 방해하여 해당 쿼리의 성능이 영향을 받을 수 있습니다.
초기 DECLARE 문 다음에 테이블 정의를 변경할 수 없습니다.
INSERT EXEC 또는 SELECT INTO 문에서 테이블 변수를 사용할 수 없습니다.
테이블 유형 선언에서 CHECK 제약 조건, DEFAULT 값 및 계산된 열은 사용자 정의 함수를 호출할 수 없습니다.
EXEC 문 또는 sp_executesql 저장 프로시저 외부에서 테이블 변수를 만든 경우 EXEC 문 또는 sp_executesql 저장 프로시저를 사용하여 테이블 변수를 참조하는 동적 SQL Server 쿼리를 실행할 수 없습니다. 테이블 변수는 로컬 범위에서만 참조할 수 있기 때문에 EXEC 문과 sp_executesql 저장 프로시저는 테이블 변수의 범위 밖에 있게 됩니다. 그러나 테이블 변수 로컬 범위가 EXEC 문이나 sp_executesql 저장 프로시저에 있기 때문에 EXEC 문이나 sp_executesql 저장 프로시저 내에서 테이블 변수를 만들고 모든 처리를 수행할 수 있습니다.
질문 4: 실제 디스크에 있는 데이터베이스에서 유지되기 때문에 임시 또는 영구 테이블에 비해 향상된 성능을 보장하는 테이블 변수 메모리 전용 구조가 있습니까?

대답 4: 테이블 변수는 메모리 전용 구조가 아닙니다. 테이블 변수에는 메모리에 저장할 수 있는 것보다 많은 데이터를 저장할 수 있기 때문에 디스크에 데이터를 저장할 위치가 있어야 합니다. 테이블 변수는 임시 테이블과 유사한 tempdb 데이터베이스에 만들어집니다. 메모리를 사용할 수 있는 경우 테이블 변수와 임시 테이블 모두 메모리에 만들어지고 처리됩니다(데이터 캐시).

질문 5: 임시 테이블 대신 테이블 변수를 사용해야 합니까?

대답 5: 대답은 다음 세 가지 요소에 따라 달라집니다.
테이블에 삽입된 행 수
쿼리가 저장된 재컴파일 수
쿼리 유형 및 성능에 대한 인덱스와 통계의 종속성
경우에 따라 임시 테이블이 있는 저장 프로시저를 작은 저장 프로시저로 나누면 재컴파일이 더 작은 단위로 발생하므로 유용합니다.

일반적으로 상당히 많은 양의 데이터가 있고 테이블 사용이 반복될 때를 제외하고는 가능하면 테이블 변수를 사용하는 것이 좋습니다. 이 경우 임시 테이블에 인덱스를 만들어 쿼리 성능을 높일 수 있습니다. 그러나 각 시나리오는 다를 수 있습니다. 테이블 변수가 특정 쿼리나 저장 프로시저에 대한 임시 테이블보다 유용한지 테스트하는 것이 좋습니다.

그래도 원하는 정보를 찾을 수 없으면 다음 Microsoft SQL Server 뉴스 그룹을 방문하십시오. Microsoft SQL Server 뉴스 그룹 (http://support.microsoft.com/newsgroups/)

이 문서나 다른 Microsoft SQL Server 기술 자료 문서에 대한 의견이 있으면 SQLKB@Microsoft.com (mailto:sqlkb@microsoft.com)으로 보내주시기 바랍니다.



Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹 (http://support.microsoft.com/newsgroups/default.aspx)에 참여하시기 바랍니다.

+ Recent posts