본문 바로가기

wow db Log/ms-sql

[펌] 임시테이블과 테이블 변수는 언제 사용하는게 좋은가?(sql-server)

SQL-Server 프로그래밍을 하면서 고민되는 것 중 한 가지는 임시로 데이터를 담아 놓을 테이블로 어떤 타입을 사용할 것인지 결정하는 것이다. 데이터 사이즈가 큰지, 인덱스가 필요한지, 프로그램의 실행 주기 등등에 따라 어떤 것을 선택할지가 달라지게 되기 때문이다. 그래서 이 선택은 다른 프로그래머들과 코드 리뷰시 종종 토론의 주제가 되곤 한다. 오늘 이 부분에 대해 정리를 해놓은 블로그가 있어 소개한다.

1) 데이터 지속성: 임시 테이블에 저장하는 데이터를 프로그램 실행이 끝난 후에도 남기고 싶다면 당연히 임시가 아닌 일반 테이블을 사용해야 한다. [개인 생각] 혹은 전역 임시 테이블(Global Temporary Table)을 사용해도 된다. 임시 테이블(Tempoary Table)과 테이블 변수(Table variable)의 경우 프로그램 실행 후 삭제되는 휘발성 저장 공간이지만, 전역 임시 테이블은 데이터를 삭제하지 않는다. 이 경우 Tempdb 데이타에비스에 데이터를 저장하게 된다.

2) CPU 사용: CPU를 적게 사용하는 쿼리를 만들고자 한다면 어떤 테이블 형식을 사용하든 상관없다. 대신 인덱스를 제대로 정의하고 있는지 체크해야 한다. 항상 Priamry Key를 가지는게 좋고, Order By로 정렬할 때는 Clustered Index가 제대로 정의되었는지 체크해야 한다. [개인 생각] 인덱스를 사용해야 하는 경우 테이블 변수를 사용할 수 없다. 왜냐하면 테이블 변수에는 인덱스를 정의할 수 없기 때문이다 (Schema 정의에 들어가는 Primary key 제외).

3) 속도: 여기도 역시 첫번째로 중요한 것은 인덱스… 두번째 중요한 것은… 테이블 변수가 임시 테이블보다 빠르긴 하지만, 데이타 양이 많은 경우 임시 테이블이 훨씬 빠른 것을 볼 수 있다. [개인 생각] 테이블 변수와 임시 테이블은 데이터를 처리하는 공간이 각기 다르다. 테이블 변수는 메모리 상에서 테이블을 만들어 처리하기 때문에 속도가 빠르지만, 처리하는 용량에 한계가 있을 수 밖에 없다. 이에 반해 임시 테이블은 tempdb 라는 데이터베이스에서 처리하기 때문에 일반 테이블처럼 인덱스만 잘 잡아 놓으면 데이터가 아무리 켜져도 속도가 크게 느려지지 않는다. 다만 tempdb 데이타베이스의 성능에 영향을 받게 된다.

4) 디스크 용량: 임시 테이블, 전역 임시 테이블, 테이블 변수 모두 동일한 용량을 사용한다. [개인 생각]  테이블 변수는 메모리에서 처리하게 되는데 왜 이렇게 설명했는지 이해가 가지 않는다.

[출처] 김석주의 블로그 원문보기