Temp table 객체 생성시 세션간 충돌하지 않는 이유
- Version : SQL Server 2005, 2008, 2008R2, 2012, 2014, 2016
데이터베이스를 사용할 때 temp table(임시 테이블)을 많이 사용한다. 단일 tempdb가 여러 세션에서 동일한 개체를 만드는 경우에도 어떻게 충돌을 방지할 수 있을까? 다음 간단한 테스트를 통해서 임시테이블 생성과 충돌 방지에 대해서 알아본다.
아래 스크립트는 임시 테이블을 생성한다.
-- Session 1: Table creation CREATE TABLE #temptable_test ( id INT NOT NULL IDENTITY (1,1) ,Name CHAR(100) NOT NULL ,DOJ DATETIME NOT NULL ); |
테이블을 만든 후에 메타데이터에서 tempdb 데이터베이스 내부에 생성된 객체를 확인한다.
-- SHOW USER TABLE SELECT * FROM tempdb.sys.sysobjects WHERE TYPE = 'U' |
생성된 임시 테이블은 부정적인 개체ID와 이름에 긴 밑줄과 함께 번호가 있는것으로 확인할 수 있다. SQL Server에서는 임시테이블에 번호를 부여하여 전체 인스턴스에 대한 단일 tempdb가 여러 세션에서 동일한 개체를 만드는 경우에도 충돌을 방지할 수 있다. 동일한 이름으로 두 번째 임시 테이블을 생성한다.
-- Session 2: Table creation CREATE TABLE #temptable_test ( id INT NOT NULL IDENTITY (1,1) ,Name CHAR(100) NOT NULL ,DOJ DATETIME NOT NULL ); |
메타데이터를 확인해 보면 다른 번호를 가지고 있는 객체가 생성된 것을 확인할 수 있다.
이렇게 생성된 임시테이블은 다른 세션에서 동일한 이름을 사용해도 충돌을 방지 할 수 있으며 세션이 종료될 때 자동으로 제거된다. 임시 테이블인 세션이 종료될 때 삭제되는 것을 제외하면 일반 테이블과 유사하다.
[참고자료]
http://blog.sqlauthority.com/2014/11/27/sql-server-inside-temp-table-object-creation/
강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp