Database/MS-SQL

[스크랩] tempdb 임시테이블에 대하여

99iberty 2017. 6. 28. 09:31


http://egloos.zum.com/sweeper/v/3008903



1. 임시 테이블

임시 테이블은 이름처럼 임시로 잠깐 사용되는 테이블이다.

임시 테이블을 만드는 방법엔 두 가지가 존재한다.
  • 사용 데이터베이스를 tempdb로 잡고 테이블을 생성하는 방법
  • CREATE TABLE시 table_name 앞에 #이나 ##을 붙이는 방법
위 두가지 방법은 모두 tempdb에 테이블을 생성한다.


#을 테이블 이름 앞에 붙이면 이 테이블은 "로컬 임시 테이블"이 된다.
이 테이블은 생성한 사람만 사용할 수 있다.

##을 테이블 이름 앞에 붙이면 이 테이블은 "전역 임시 테이블"이 되며,
모든 사용자가 사용할 수 있다.

임시 테이블이 삭제되는 시점은 아래와 같다.
  • DROP TABLE로 명시적으로 삭제
  • SQLServer가 재시작 될 때 (tempdb에 들어 있으므로 당연하다)
  • 로컬 임시 테이블의 경우, 생성한 사용자의 연결이 끊기면 삭제된다.
  • 전역 임시 테이블의 경우, 이 테이블을 사용하는 사용자의 연결이 모두 끊기면 삭제된다.

2. 임시 테이블 실습

1) 쿼리창1 을 열고, 아래와 같이 로컬/전역 임시 테이블을 생성시켜 보자.

  1. CREATE TABLE #LocalTempTable
  2. (
  3.     ID INT,
  4.     Name NVARCHAR(16)
  5. )
  6. GO
  7.  
  8. CREATE TABLE ##GlobalTempTable
  9. (
  10.     ID INT,
  11.     Name NVARCHAR(16)
  12. )
  13. GO

2) 쿼리창1 에서 두 테이블에 데이터를 삽입시켜 보자.

  1. INSERT INTO #LocalTempTable VALUES (1, N'로컬임시테이블')
  2. INSERT INTO #LocalTempTable VALUES (2, N'전역임시테이블')

3) 쿼리창1 에서 두 테이블의 데이터를 조회해 보자.

  1. SELECT * FROM #LocalTempTable
  2. SELECT * FROM ##GlobalTempTable

4) 쿼리창2 를 열고, 두 테이블을 조회해 보자.

  1. SELECT * FROM #LocalTempTable
  2. 메시지 208, 수준 16, 상태 0, 줄 1
  3. 개체 이름 '#LocalTempTable'() 잘못되었습니다.
  4.  
  5. SELECT * FROM ##GlobalTempTable

로컬 임시 테이블은 해당 세션(쿼리창1)에서만 유효하므로, 쿼리창2 에서는 인식이 되지 않는다.

5) 쿼리창1 과 쿼리창2 를 닫고, 쿼리창3 에서 두 테이블을 조회해 보자.

  1. SELECT * FROM #LocalTempTable
  2. GO
  3. 메시지 208, 수준 16, 상태 0, 줄 1
  4. 개체 이름 '#LocalTempTable'() 잘못되었습니다.
  5.  
  6. SELECT * FROM ##GlobalTempTable
  7. GO
  8. 메시지 208, 수준 16, 상태 0, 줄 1
  9. 개체 이름 '##GlobalTempTable'() 잘못되었습니다.

로컬 임시 테이블은 당연히 쿼리창1 이 아니기에 조회가 되지 않고,
쿼리창3 을 수행하기 전에 쿼리창1, 쿼리창2 를 모두 닫았기에,

쿼리창1의 세션이 끊겨 로컬 임시 테이블이 삭제되었고,
전역 임시 테이블을 사용하던 세션들(쿼리창1, 쿼리창2)이 모두 끊겨 전역 임시 테이블도 삭제가 되었다.