SQL 사용자 Tip & 강좌
SQL 프론티어 3기 성대중입니다.
모두 새해 소망하는 일이 이루어지는 것을 볼 수 있는 한 해 되길 기원합니다.
오늘은 임시테이블과 테이블변수에 대한 몇 가지 질문을 통해 관련 내용을 정리해 보고자 합니다.
질문1) 임시테이블과 테이블변수
모두 TEMPDB에 저장되나요?
네 맞습니다. 임시테이블과 테이블변수 모두 TEMPDB에
저장됩니다. 이를 확인하기 위해 SQL Server MVP인 Ken Simmons의 아티클의
코드를 참조하여 살펴보겠습니다.
코드
결과
테이블변수와 임시테이블 모두 Tempdb 데이터베이스의 개체로
생성됨을 확인할 수 있습니다. 테이블변수의 경우 #해시코드
형식의 이름을 가지며, 임시테이블의 경우 사용자가 지정한 테이블명+____+ID값으로
그 이름이 부여된 것을 확인할 수 있습니다.
질문2) 임시테이블과 테이블변수
뭐가 다른가요?
아래와 같은 표로 정리할 수 있겠습니다.
출처: Inside Microsoft SQL Server 2005 T-SQL Programming 2장 : 임시테이블과 테이블변수
이 중 중요하게 기억해 두어야 할 것은 테이블변수는 통계정보를
관리하지 않는다는 것입니다. 테이블변수에는 오직 기본키 제약조건만 설정할 수 있으며, 추가적으로 인덱스나 UNIQUE 제약조건를 생성할 수 없습니다. 이는 실행계획 측면에서 효율적인 최적화가 어렵다는 단점이 될 수 있지만, 반면에
테이블변수에서는 통계정보 변경으로 인한 재컴파일 이슈는 발생하지 않는다는 장점도 있습니다.
질문3) 임시테이블과 테이블변수
언제 써야 하나요?
우선 중요하게 판단할 요소는 1)
해당 테이블에 입력된 데이터 행수 2) 재컴파일 이슈 존재여부 3) 성능을 위해 인덱스 또는 통계 정보가 필요한지 여부가 있을 것입니다. 입력되는 데이터가 많아질수록 성능을 위해 통계 및 인덱스 필요 가능성이 높아지고, 쿼리에서 해당 개체를 어떻게 참조하고 사용해야 하는지에 따라 적절한 선택이 필요하다고 판단됩니다.
결론
임시테이블과 테이블변수는 각각의 목적에 따라 정확한 용도로 사용되어야 합니다. 관례에 따라
무조건 둘 중 무엇을 사용하는 것이 좋다, 무조건 사용하지 않아야 한다, 무조건 사용해야 한다고 생각해 왔었다면, 이번 아티클을 통해서 한
번쯤 다시 왜? 라는 고민을 해 볼 수 있었으면 좋겠습니다. 또한, 임시테이블 및 테이블변수에 관련된 재미난 이슈가 있다면 이 아티클을 계기로 질의/응답게시판 등을 통해 서로의 경험을 공유할 수 있었으면 좋겠습니다.
■ Response 2012

SQL 프런티어그룹 3기
SQL Server MVP
씨퀄로(SQLRoad.com) 수석컨설턴트
네이버 지식인 데이터베이스 디렉토리 에디터
한국데이터베이스 진흥원 DB Q&A - MSSQL 담당
저것을 판가름 할 수 있따는 것이 경험과 실력의 차를 보여주겠지요... 전.....................................ㅜㅜ
아직 임시 테이블이 편하다는 이유로 OTL
--작은 차이 하나가 빠진거 같아서.. ㅋ
-- 함수에서 테이블 변수를 사용하는 건 됨
CREATE FUNCTION tes_tableVariable()
RETURNS int
BEGIN
DECLARE @aa TABLE ( abc INT);
RETURN 1;
END
drop function tes_tableVariable;
--임시 테이블을 함수에서 맹글 수가 없...
CREATE FUNCTION test_tmpTable()
RETURNS INT
BEGIN
CREATE TABLE #aa( abc INT);
RETURN 1
END

성대중(지우아빠)
jevida(강성욱)
코난(김대우)

한눈에 알아 보기 쉽게 정리해 주셔서 감사합니다.
잘 보고 갑니당 ^^
새해 복 많이 받으세요!