#title 임시테이블사용패턴 [[TableOfContents]] 문서 작성 중.. 많은 사람들이 임시테이블의 맛에 빠지면 빠져나오는데 많은 시간이 걸리거나 아예 빠져나오지 못하는 경우도 많이 있다. 이 문서에서는 임시테이블의 불필요한 사용 예에 대한 패턴을 분석하였다. ==== 개요 ==== 임시테이블은 상당히 유용하면서 그 편리함에 개발자들은 자주 유혹에 이끌리곤 한다. 개발자들은 임시테이블이 마치 2차원 배열구조인 것처럼 일반적인 프로그래밍 하듯이 SQL을 작성하거나 프로시저를 작성한다. 프로시저가 좋기는 하지만 If, While, Temp Table을 사용하라고 프로시저가 있는 것이 아니다. 이것은 MSSQL Server의 가장 큰 장점이자 단점이 되어 버렸다. 어떤 사이트에서는 프로시저의 확장성이 부른 결과로 실제 DB보다 tempDB의 입/출력이 더 많이 있는 경우도 있었다. 인라인뷰 대신 임시테이블을 사용하여 액세스 효율을 떨어뜨리는 결과도 있다. 대부분 이런 경우는 인덱스나 설계가 제대로 되지 않은 상태에서 구현을 하게 되어 임시테이블에 넣는게 훨씬 빠른 결과를 나타내기도 하고, 업무에 쫓기거나, 아니면 몰라서 그런 것이다. 설계는 관계형 모델로 해놓고, 실제 구현은 3GL에서의 방식을 못버리는 것이 가장 큰 문제일 것이다. 또 한가지 문제는 프로시저의 Recompile 이다. 프로시저에 DDL문이 들어가게 되면 Recomplie 하게 되는데 많은 프로시저에서 임시테이블을 만들어 사용한다면 당연히 Recompile로 인한 부하도 있기 마련이다. Recomplie에 대한 사항은 다시 다룰 것이다. ==== 패턴1: 불필요한 임시테이블의 사용 ==== insert #temp select ... insert #temp select ... insert #temp select ... insert aaa select * from #temp ==== 저장 프로시저 재컴파일 ==== 재컴파일 임계값 계산 ||테이블종류||재컴파일 임계값|| ||영구테이블||if n <= 500 then 500 else 500 * 0.2 * n|| ||임시테이블||if n < 6 then 6 else if 6 <= n <= 500 then 500 else 500 * 0.2 * n|| {{{* n:카디널리티, 출처: http://sqlnote.com/zbxe/473#0}}}