임시 테이블(Temporary Tables)과 테이블 변수(Table Variables)는 쿼리나 프로시저 실행 시간 동안 중간 데이터를 저장하는 서로 다른 메커니즘입니다.
임시 테이블(예: #TempTable in MS SQL):
테이블 변수(예: @MyTable):
예시:
-- 임시 테이블 CREATE TABLE #Temp( Id INT, Name NVARCHAR(100) ); INSERT INTO #Temp VALUES (1, 'Test'); SELECT * FROM #Temp; -- 테이블 변수 DECLARE @MyTable TABLE (Id INT, Name NVARCHAR(100)); INSERT INTO @MyTable VALUES (2, 'Sample'); SELECT * FROM @MyTable;
임시 테이블 #TempTable과 글로벌 임시 테이블 ##GlobalTempTable의 생존 시간과 가시성의 차이는 무엇인가요?
정답:
#TempTable은 현재 세션에서만 볼 수 있으며, 연결 종료 또는 명시적 DROP 시 삭제됩니다.##GlobalTempTable은 마지막 세션이 종료될 때까지 모든 세션에서 사용 가능하며, 명시적 DROP 시 삭제됩니다. 마지막 연결이 종료될 때만 사라집니다.-- 글로벌 임시 테이블 CREATE TABLE ##GlobalTemp (Id INT);
이야기
대규모 보고서를 처리하는 프로젝트에서 수십만 개의 행을 임시 저장하기 위해 테이블 변수를 사용했습니다. 결과: 쿼리 비용을 과대 평가하여 부적합한 계획을 사용하게 되어 성능이 급격히 저하되었습니다. tempdb의 임시 테이블로 교체했더니 시간 향상 효과를 얻었습니다.
이야기
하나의 프로시저에서 임시 테이블을 명시적으로 삭제하는 것을 잊었습니다. 반복된 배치 실행에서 "객체가 이미 존재합니다"라는 오류가 발생했습니다. 테이블 생성 전에 DROP TABLE을 추가하니 문제가 해결되었습니다.
이야기
보고서 간의 상호 작용을 위해 글로벌 임시 테이블을 사용했습니다. 동시에 실행되면 예측할 수 없는 동작이 발생하여 세션이 동일한 데이터에 대해 충돌했습니다. 글로벌 테이블을 각 세션의 개별 임시 테이블로 변경하기로 결정했습니다.