 
임시테이블
1 임시 테이블의 테이블 이름은 숫자 기호(#)로 시작합니다.
사용자가 연결이 끊겼을 때 임시 테이블이 삭제되지 않는 경우 SQL Server는 자동으로 임시 테이블을 삭제합니다.
가) 임시 테이블은 현재 데이터베이스에 저장되지 않고 시스템 데이터베이스 tempdb에 저장됩니다.단 데이터 건수가 작을때는 메모리에만 존재 Tempdb 사이즈 증가 안함 (데이터가 29 K 이하 일때는 메모리에 존재 )
나) 로컬 임시 테이블
① 하나의 숫자 기호(#) 으로 시작함.
② 이 테이블은 테이블을 만든 연결에서만 볼 수 있음.
다) 전역 임시 테이블
① 두개의 숫자 기호(##) 으로 시작함.
② 이 테이블을 만든 연결이 끊어지기 전에 이 테이블이 명시적으로 삭제되지 않으며 다른 모든 작업이 이 테이블에 대한 참조를 중지할 떄 바로 삭제됩니다.
라) 장점
① 인덱스를 작성할 수 있다.
② FK(외래키)를 제외한 나머지 제약을 지정할 수 있다.
③ 테이블은 작성이 되지만 경고 메시지와 함께 FK 선언은 제외된다.
④ ALTER TABLE이 가능하다.
⑤ INSERT INTO, BULK INSERT 문과 함께 사용할 수 있다.
테이블변수
1. SQL Server 2000 버전에서 새로 추가된 형식으로 임시 테이블을 만들어 사용하는 것과 비슷한 역할을 수행 함.
2. 임시 테이블은 현재 데이터베이스에 저장되지 않고 시스템 데이터베이스 tempdb에 저장됩니다. 단 데이터 건수가 작을때는 메모리에만 존재 Tempdb 사이즈 증가 안함 ( 데이터가 29 K 이하 일때는 메모리에 존재 )
3. 테이블 변수 특징
A. 테이블 변수는 테이블 변수가 정의된 함수 및 저장 프로시져 및 일괄 처리가 끝나면 자동으로 정리됨.
B. 테이블 변수와 관련된 트랜잭션은 테이블 변수가 업데이트 되는 동안만 지속됨. 따라서 테이블 변수를 사용하면 리소스 잠금과 로깅에 대한 요구가 줄어듬.
4. 장점
A. Primary Key(기본키), UNIQUE(유일키), CHECK 제약을 쓸 수 있다.
B. IDENTITY(식별자) 속성을 지정할 수 있다.
C. SELECT, INSERT, UPDATE, DELETE 문에 사용할 수 있다.
5. 제약사항
A. FK를 사용할 수 없다.
B. ALTER TABLE를 할 수 없다.
C. 추가 인덱스를 선언할 수 없다. (클러스터 인덱스는 가질 수 있다)
D. 그러나 PK, UNIQUE가 있다.
E. 로컬 변수나, UDF 안에서만 사용된다.
F. 임시 테이블의 테이블 이름은 숫자 기호(#)로 시작합니다.
[[[[[[[[[[[[[[[ 임시테이블 VS 테이블변수 ]]]]]]]]]]]]]]]]]
성능 데이타 비교
임스 테이블과 테이블 변수의 특징
임시테이블 :
1.명시적으로 삭제를 안할 시에는 세션 연결 기간동안 존재
2.저장소는 Tempdb
3.대용량에서는 쿼리 비용 유리
4.대용량 데이터 처리에 유리, 세션 단위 처리시에 사용
테이블 변수 :
1. 명시적으로 삭제를 안할 시에는 배치 처리기간 동안 존재
2.저장소는 Tempdb
3.소용량에서 쿼리 비용 유리
4.소용량 데이터 처리에서 유리, 저장 프로시져에서 테이블 변수 사용하면 임시 테이블 사용할 떄보다 저장 프로시저를 다시 컴파일하는 일이 줄어듬,배치 처리 단위인 저장 프로시져에서 사용 유리
테이블 변수를 사용하는 방법과 임시 테이블을 사용하는 방법 간에는 큰 성능상의 차이가 있다. 대부분의 경우에 임시 테이블이 테이블 변수보다 속도가 빠르다.
쿼리를 테이블 변수를 사용하여 작성한 경우에는 SMP(동기 다중 프로세서) 환경하에서도 병렬처리 쿼리 계획을 생성하지 않게 되지만, 실제로 동일한 역할을 하는 쿼리를 로컬 또는 전역 임시 테이블을 사용하여 작성하게 되면 병렬처리 쿼리 계획을 생성하기 때문에 성능상의 차이가 발생하게 된다.
SQL 서버 개발팀의 고위 관계자는 테이블 변수를 사용하게 되면 내부적인 메타 데이터를 사용하기 때문에, 테이블 변수를 사용하게 되면 SQL 서버 엔진 내에서 병렬처리 쿼리 계획을 생성하지 못한다는 정보를 제공해 주었다. 또한 SQL 서버는 임시 테이블을 포함하고 있는 쿼리에 대한 통계값은 지속적으로 관리하게 되지만, 테이블 변수를 포함하고 있는 쿼리에 대한 통계값은 유지하지 않는다. 통계값이 없기 때문에 SQL 서버는 테이블 변수를 포함하고 있는 쿼리에 대해서 잘못된 쿼리 처리계획을 생성할 수도 있다. 또한 SQL 서버 개발팀에서는 SQL 서버의 테이블 변수는 가능하다면 소규모의 쿼리나 데이터 집합을 위한 용도로 사용하고, 대용량 데이터 집합을 처리하기 위해서는 임시 테이블을 사용하는 것이 바람직하다고 권고한다.
테이블 변수에 대한 이러한 권고는 지금까지 마이크로소프트 측에서 테이블 변수는 메모리 내에서 생성되기 때문에 좀 더 빠른 성능을 제공한다는 주장과 일부 상충하는 면이 있다. 하지만 실제로 테이블 변수의 경우도 임시 테이블과 거의 유사한 디스크 I/O를 발생시킨다.
실제로 테이블 변수를 사용할 것인지 임시 테이블을 사용할 것인지를 결정하려고 할 때는 실제 환경에서 두 가지 경우를 모두 구현한 다음 서로 비교해 보고 선택하는 것이 바람직하다. 필자의 경우에는 대부분 결과집합이 커질수록 임시 테이블을 사용하는 것이 더 빠른 성능을 제공한다는 점에 대해서는 약간의 의문을 가지고 있다.
|