[펌]  www.sqlnote.com



예전부터 임시테이블과 테이블변수의 사용에 있어 의견들이 분분했던것 같다.
주로 일괄처리안에 데이터를 임시로 저장해야할때 사용하는데
둘의 내부동작에 대해 살짝 끄적여보자.

임시테이블은 Tempdb에 생성되는데 Tempdb는 임시데이터의 보관소로 임시테이블외 정렬,커서,스풀테이블등
이 저장된다. (이를 위해 성능향상 목적으로 Tempdb의 CPU별 분산디스크배치도 고려해야한다.)
또한  테이블과 마찬가지로 분포통계를 생성하고 관리하는데 영구테이블보다는
민감하고 엄격한 재컴파일규칙을 가진다. 즉 재컴파일 임계값이 적다.

영구테이블 재컴파일 임계값 계산:
n(n = 카디널리티) <= 500 이면 , RT(재컴파일 임계값) = 500
n > 500이면, RT = 500 * 0.20 * n
임시테이블 재컴파일 임계값 계산:
n < 6 이면, RT = 6
6 <= n <= 500 이면 RT = 500
n > 500 이면, RT = 500 + 0.20 * n

임시테이블에 6개의 행을 입력하고 7번째 행을 입력하면 재컴파일이 발생되고
영구테이블에는 500행이 넘게 입력되야 재컴파일이 일어난다.

이때문에 임계값이상의 행이 변경될 가능성이 높기때문에 아무래도 재컴파일 확률이 높아진다.
이를위해 KEEP PLAN 힌트를 사용해 영구테이블의 재컴파일 규칙을 따르겠다라고 적용해
재컴파일 확률을 줄일수도 있다.
이부분이 테이블변수와 구분되는 부분이다.즉 데이터량이 크고 인덱스를 활용해 통계정보를 사용해야 하는경우
임시테이블이 유리할수 있다.

테이블변수역시 Tempdb에 생성되고 관리된다. 예전에 어느 사이트에선가 이 내용에 대한 이슈가 있었던것 같다.
(기억이 잘 안난다) 메모리에만 적재된다 와 Tempdb에 저장된다로 논쟁을 벌였던것 같은데..

옵티마이저는 테이블변수에 대해서 통계정보를 생성하지도 사용하지도 않는다.
다만 테이블변수는 고유인덱스는 생성할수있어 고유인덱스컬럼에 대한 검색외에는 비효율적인 실행계획을
생성할수가 있다.
고유인덱스사용시 예상값은 1로 고정돼있어 Index Seek를 하는 반면 고유인덱스가 없는경우 통계정보를 사용할수 없어 full scan을 해버린다.
결국 테이블변수는 소용량 혹은 고유인덱스를 사용하는 임시데이터의 경우의 사용에 적절할것 같다.




이 게시물을..