Programming/Microsoft SQL Server

1. 임시 Table

임시 Table이란 말 그대로 tempdb에 임시적으로 만들어지는 Table로서 특징에 따라 지역임시Table과 전역임시Table 두가지로 나눌 수 있습니다.

지역임시Table은 Table이 생성되는 Session이 끝나면 자동으로 삭제됨니다. 예를들어 Procedure내에서 지역임시Table이 생성되었을때 해당 Procedure가 종료되면 Drop Table을 사용하지 않더라도 자동으로 삭제되는 것입니다.

반면 전역임시 Table은 Table을 사용(참조)하고 있는 모든 작업이 종료되어야만 삭제되는 특징을 가지고 있습니다. 활용되는 범위로 따진다면 전역임시Table이 더 큰 범위를 안고 있는 것입니다.

임시Table을 생성하려면 Table생성시 이름앞에 #을 추가함으로써 이 Table이 임시Table임을 알려줘야 합니다.(#이 하나 쓰이면 지역임시Table, #이 두개(##)가 쓰이면 전역임시Table이 됩니다.)

다음은 임시Table의 활용예제입니다.

Select *
Into #Temp2
From Production.ScrapReason

지역임시Table #Temp2를 생성하고 Production.ScrapReason Table의 내용을 지역임시Table에 담습니다.
단, 다음 처럼 임시Table을 미리 만들어서 저장할 수도 있습니다.

Create Table #Temp2(
 ScrapReasonID Smallint,
 Name   nVarchar(50),
 ModifiedDate DateTime
)

Insert Into #Temp2
Select *
From Production.ScrapReason



이때 만일 SQL Management에서 새로운 Query창을 열고 위에서 만든 지역임시Table을 불러오려고 하면 오류가 발생할 것입니다. 지역임시Table은 해당 세션안에서만 유효한 것입니다.


Select *
Into ##Temp2
From Production.ScrapReason

전역임시Table인 ##Temp2를 생성하고 Production.ScrapReason Table의 내용을 담습니다.

Select *
From ##Temp2

전역임시Table인 ##Temp2 Table을 조회합니다.


SQL Management창에서 새로운 Query창을 열고 ##Temp2을 다시 조회하면 정상적으로 조회됨을 확인하실 수 있습니다. 이것이 지역임시Table과 다른점중에 하나입니다.

2. Table변수

Table변수는 Meory상에 일시적으로 생성되는 Table로 Query가 실행되는 Session안에서만 유효하며 일반 변수와 같습니다. 또한 Table변수는 Primary Key, Null, Check 이 세가지 제약조건만 허락하며 Table변수선언시 사용자 데이터형식은 사용할 수 없습니다.

주의하실 점은 Table변수를 사용하려면 먼저 생성되어 있어야 한다는 것입니다.

Declare @Temp2 Table(
 ScrapReasonID Smallint,
 Name   nVarchar(50),
 ModifiedDate DateTime
)

따라서 다음과 같이 임시Table을 사용할때 처럼 Table변수를 생성하는건 불가능합니다.

Select *
Into @Temp2
From Production.ScrapReason

Table변수는 반드시 미리 생성되어 있어야 합니다.

위 예제Query를 보시면 Create Table대신에 Declare가 사용되었습니다. Table 변수는 말그대로 변수이기 때문에 변수를 선언할때와 마찬가지로 Declare가 사용되는 것입니다.
또한 Table변수는 Table이름의 맨앞에 @문자가 선행되어야 합니다.

Insert Into @Temp2
Select *
From Production.ScrapReason

위에서 생성한 Table변수에 Production.ScrapReason Table의 내용을 담습니다.

Select * From @Temp2

Table변수을 조회합니다.


위와 같이 Table변수의 생성, 저장, 조회하는 일련의 작업과정은 Query가 실행되는 Session안에서 한단위로 이루어 져야 합니다. 예를 들어 Table변수을 생성하는 부분과 Table변수에 데이터를 저장하는 부분을 별도의 Session안에서 실행하려고 하면 오류를 일으키게 되는 것입니다.

참고:
보통의 경우 성능향상을 위해서는 임시Table보다는 Table변수가 더 유리합니다. 또한 SQL Server에 Disk관련 I/O가 많아 성능상에 Issue가 발생했을 경우 Table변수를 활용하면 이 문제를 어느정도 해소할 수 있습니다. 단 Table변수는 Memory상에 배치되고 실행되는 것이므로 Memory자원을 더 많이 잡아먹는 단점이 있습니다.

따라서 분명 임시Table이나 변수Table은 용도에 따라 각각의 이점이 있을 것입니다. 따라서 맹목적으로 Table변수를 고집할 필요는 없습니다. 난해한 표현이지만 상황에 맞게 가장 적절한 대안을 찾으시길 바랍니다.


'Programming > Microsoft SQL Server' 카테고리의 다른 글

[SQL] Replicate로 문자열 채워넣기  (0) 2010.08.26
[SQL] Delete  (0) 2010.08.25
[SQL] 임시 Table과 변수 Table  (2) 2010.08.24
[SQL] 구성함수(전역변수)  (0) 2010.08.20
[SQL] 트랜잭션(Transaction)  (0) 2010.08.19
[SQL] 저장프로시저(Store Procedure)  (0) 2010.08.17
2 0