반응형

로컬 임시 테이블의 활용 (1)

 

백도훈

에이디컨설팅 선임 컨설턴트

 

 

이야기를 하기에 앞서 비슷한 용어 때문에 혼란이 생기지 않도록 글에서 사용될 용어를 정리하겠습니다.

-          로컬 임시 테이블. 흔히 말하는 [#테이블], 세션에 독립적이며 세션 연결이 끊기면 삭제되는 테이블

-          전역 임시 테이블. [##테이블], 모든 세션에서 사용가능하며 생성 세션이 끊기고 사용중인 세션이 없을 삭제되는 테이블

-          임시 생성 테이블. 어떤 작업을 수행하기 위해 임시적으로 생성하는 테이블.

 

패키지를 만들 임시로 테이블을 만들어서 처리해야 하는 경우가 있습니다. 여기서 말하는 임시 테이블은 [#테이블] 같은 로컬 임시 테이블이 수도 있고 [##테이블] 같은 전역 임시 테이블이 있으며 [tmpTableName] 등과 같은 일반 테이블일 수도 있습니다.

경우 로컬 임시 테이블을 제외한 나머지 유형의 테이블을 사용하는 경우 동시성에 문제가 있습니다. 예를 들어 패키지 실행 전에 임시 생성 테이블이 존재한다면 삭제하고 생성해라라는 명령이 있고 패키지를 수행하는 여러 개의 작업(SQL Agent Job) 있을 작업에서는 임시 생성 테이블에 데이터를 입력하고 있는 도중에 다른 작업에서는 임시 생성 테이블을 삭제하는 경우가 발생할 있습니다. 저장 프로시저에서는 이러한 동시성 문제 때문에 로컬 임시 테이블([#테이블]) 또는 테이블 변수 등을 사용합니다.

 

하지만 SSIS에서는 기본적으로 태스크 마다 연결을 맺고 끊는 방식이기 때문에 로컬 임시 테이블을 여러 태스크에서 이용하기가 어렵습니다.


 

 

 

로컬 임시 테이블이 아닌 테이블로 테스트 해보면 실행이 됩니다.


 

 

SSIS에서도 로컬 임시 테이블을 사용할 방법이 전혀 없는 것은 아닙니다. 연결 관리자의 연결 속성 RetainSameConnection 속성을 이용하는 것입니다. 속성에 대해서는 한대성 께서 이전 게시물 설명해 놓으셨습니다. 속성에 대해서 짧게 설명하자면 DB 한번 맺은 연결을 패키지가 종료할 때까지 끊지 않는 것입니다.

 

그러면 속성을 변경해서 작업 단위로 접속하던 세션을 패키지 범위로 유지할 있겠군요.

대신 세션이 끊어지지 않은 상태이기 때문에 경우에 따라서는 동일한 DB 사용하더라도 연결 관리자에 연결을 별도로 추가해줘야 하는 문제는 있습니다.
반응형

+ Recent posts