🗄️ MSSQL 테이블 변수와 임시 테이블 차이 완벽 가이드
⚡ 짧은 범위는 테이블 변수, 대량 데이터 처리엔 #temp가 정답입니다
데이터베이스 개발이나 성능 최적화를 하다 보면, 테이블 변수와 임시 테이블(#temp) 중 어떤 것을 선택해야 할지 고민하는 경우가 많습니다.
쿼리 실행 속도, 메모리 사용량, 인덱스 활용 가능 여부에 따라 최적의 선택이 달라지기 때문에, 단순히 편한 쪽을 택하는 것은 좋은 전략이 아닙니다.
특히 많은 행을 처리해야 하거나 복잡한 쿼리 최적화가 필요한 경우, 선택 하나가 전체 성능에 큰 영향을 줄 수 있죠.
이 글에서는 두 방식의 특징과 차이, 그리고 상황별 올바른 선택 방법을 알기 쉽게 정리해드립니다.
짧은 범위에서 단순 데이터 처리를 할 때는 테이블 변수가 간단하고 효율적일 수 있습니다.
반면 수천~수백만 건 이상의 데이터를 다루거나, 중간 단계에서 인덱스를 적극적으로 활용해야 하는 경우에는 임시 테이블(#temp)이 강력한 도구가 됩니다.
이 글을 읽고 나면, 여러분은 상황에 따라 어떤 도구를 선택해야 할지 명확하게 판단할 수 있을 것입니다.
🗄️ 테이블 변수란?
테이블 변수(Table Variable)는 MSSQL에서 DECLARE 문을 사용해 선언하는 일종의 변수로, 데이터 구조와 값을 메모리에 저장하는 임시 테이블 형태입니다.
주로 간단한 데이터셋을 처리하거나 프로시저, 함수 내부에서 짧은 범위의 데이터 보관 용도로 사용됩니다.
테이블 변수는 트랜잭션 로그에 최소한의 기록만 남기기 때문에, 생성과 삭제 과정이 비교적 가볍습니다.
일반적으로 테이블 변수는 작은 데이터셋을 다룰 때 빠르고 효율적입니다.
다만, 인덱스 생성이 제한적이며, 통계 정보가 자동으로 갱신되지 않아 대규모 데이터 처리에는 적합하지 않습니다.
즉, 수천 건 이하의 간단한 데이터 연산이나 로직 제어에 사용하면 유리합니다.
🛠️ 테이블 변수의 주요 특징
- 📌메모리에 저장되어 생성과 삭제가 빠름
- 📌트랜잭션 롤백 영향 없음
- 📌클러스터형 인덱스 자동 생성 (기본키 지정 시)
- 📌통계 정보 자동 갱신 불가
💡 테이블 변수 선언 예시
DECLARE @UserTable TABLE (
UserID INT PRIMARY KEY,
UserName NVARCHAR(50),
RegDate DATETIME
);
INSERT INTO @UserTable (UserID, UserName, RegDate)
VALUES (1, '홍길동', GETDATE());
SELECT * FROM @UserTable;
💎 핵심 포인트:
테이블 변수는 메모리 기반으로 가볍고 빠르지만, 인덱스와 통계 정보 측면에서 제약이 있으므로 대량 데이터 처리에는 부적합합니다.
📊 임시 테이블(#temp)이란?
임시 테이블(Temporary Table)은 CREATE TABLE 구문을 사용해 생성하며, 이름 앞에 # 또는 ##를 붙여 구분합니다.
단일 해시(#)는 세션 범위에서만 유효한 로컬 임시 테이블을, 이중 해시(##)는 모든 세션에서 접근 가능한 글로벌 임시 테이블을 의미합니다.
임시 테이블은 TempDB 데이터베이스에 실제로 저장되며, 세션이 종료되면 자동 삭제됩니다.
임시 테이블은 대량의 데이터나 복잡한 쿼리 처리에서 강력한 성능을 발휘합니다.
특히 인덱스 생성이 자유롭고, 통계 정보가 자동으로 갱신되어 최적화된 실행 계획을 수립할 수 있습니다.
이 때문에 데이터 마트 전처리, 집계, 조인 연산 등에서 자주 사용됩니다.
🛠️ 임시 테이블의 주요 특징
- 📌TempDB에 저장되어 세션 종료 시 자동 삭제
- 📌인덱스 생성 및 통계 정보 갱신 가능
- 📌복잡한 조인과 그룹화 연산에 유리
- 📌대량 데이터 처리 성능이 우수
💡 임시 테이블 생성 예시
CREATE TABLE #UserTemp (
UserID INT PRIMARY KEY,
UserName NVARCHAR(50),
RegDate DATETIME
);
INSERT INTO #UserTemp (UserID, UserName, RegDate)
VALUES (1, '김철수', GETDATE());
SELECT * FROM #UserTemp;
💎 핵심 포인트:
임시 테이블은 인덱스와 통계 정보 관리가 가능해 대량 데이터 처리와 복잡한 쿼리에 적합하며, 성능 최적화를 위해 자주 활용됩니다.
⚙️ 성능 비교와 사용 시 주의점
테이블 변수와 임시 테이블은 모두 임시 데이터를 저장하는 목적을 가지지만, 저장 위치와 쿼리 최적화 방식에서 큰 차이가 있습니다.
테이블 변수는 메모리 중심으로 작동하여 소규모 연산에서 빠르지만, 대규모 데이터에는 성능 저하가 발생할 수 있습니다.
반면 임시 테이블은 TempDB에 저장되어 I/O 부하가 있지만, 인덱스와 통계 정보를 활용할 수 있어 대량 처리에서 강점을 가집니다.
또한, 테이블 변수는 트랜잭션 롤백의 영향을 받지 않아 일부 시나리오에서 예측 가능한 동작을 보장하지만, 임시 테이블은 트랜잭션 롤백 시 데이터가 복원되므로 이 점을 고려해야 합니다.
쿼리 작성 시 이러한 특성을 무시하면, 성능뿐 아니라 데이터 무결성에도 영향을 줄 수 있습니다.
📊 성능 비교 표
| 구분 | 테이블 변수 | 임시 테이블 |
|---|---|---|
| 저장 위치 | 메모리 중심 | TempDB |
| 인덱스 지원 | 제한적 | 자유롭게 생성 가능 |
| 통계 정보 | 자동 갱신 불가 | 자동 갱신 가능 |
| 적합한 데이터량 | 수천 건 이하 | 대량 데이터 |
⚠️ 사용 시 주의사항
⚠️ 주의: 테이블 변수를 대량 데이터 처리에 사용하면 통계 부재로 인해 잘못된 실행 계획이 생성될 수 있으며, 임시 테이블은 빈번한 생성과 삭제로 TempDB 부하가 심해질 수 있습니다.
💎 핵심 포인트:
데이터 크기와 쿼리 복잡도를 기준으로 선택하고, 환경에 따라 성능 테스트를 거친 후 사용하는 것이 안전합니다.
🔍 상황별 선택 가이드
테이블 변수와 임시 테이블 중 어느 것을 선택할지는 데이터 양, 쿼리의 복잡도, 그리고 성능 요구사항에 따라 달라집니다.
간단히 정리하면, 작은 범위의 임시 데이터는 테이블 변수가, 대량 데이터와 인덱스 활용이 필요한 경우는 임시 테이블이 적합합니다.
🗄️ 테이블 변수를 선택하는 경우
- ✅수천 건 이하의 적은 데이터 처리
- ✅함수나 프로시저 내부의 단기 임시 저장
- ✅트랜잭션 롤백 영향이 없어야 하는 경우
📊 임시 테이블을 선택하는 경우
- ✅수십만 건 이상의 대규모 데이터 처리
- ✅인덱스 생성과 통계 정보 활용이 필요한 경우
- ✅여러 단계의 조인, 그룹화, 집계 연산이 포함된 쿼리
💬 작은 범위에서는 테이블 변수, 대규모 및 복잡한 연산에는 임시 테이블이 더 효율적입니다. 성능 최적화를 위해 두 가지 모두 테스트하는 습관이 좋습니다.
💎 핵심 포인트:
두 방법 모두 장단점이 명확하므로, 프로젝트 요구사항과 데이터 특성을 분석한 뒤 선택해야 합니다.
💡 성능 최적화 팁
테이블 변수와 임시 테이블을 효율적으로 사용하려면 각 특성에 맞춘 성능 최적화 전략이 필요합니다.
무조건 한 쪽만 고집하기보다는, 상황에 따라 적절히 혼합해 사용하는 것이 전체적인 쿼리 성능을 높이는 데 도움이 됩니다.
🚀 테이블 변수 최적화
- ⚡데이터 크기가 작을 때만 사용
- ⚡가능하다면 PK를 지정해 클러스터형 인덱스 활용
- ⚡통계 정보가 없어 실행 계획이 고정될 수 있음에 유의
📈 임시 테이블 최적화
- 💾대량 데이터에 적합하지만 TempDB 부하 관리 필요
- 💾필요한 컬럼에만 인덱스 생성해 불필요한 I/O 감소
- 💾대규모 조인 시 통계 갱신 후 실행 계획 확인
💬 임시 테이블과 테이블 변수 모두, 목적에 맞게 쓰면 성능 향상에 도움이 되지만, 잘못 쓰면 병목의 원인이 됩니다.
💎 핵심 포인트:
두 구조 모두 상황에 맞는 최적화 기법을 적용하면 실행 속도와 리소스 효율을 극대화할 수 있습니다.
❓ 자주 묻는 질문 (FAQ)
테이블 변수와 임시 테이블 중 어느 것이 더 빠른가요?
임시 테이블은 메모리를 사용하지 않나요?
테이블 변수에 인덱스를 만들 수 있나요?
임시 테이블의 수명은 어떻게 되나요?
테이블 변수를 사용하면 트랜잭션에 영향을 받지 않나요?
임시 테이블 사용 시 TempDB 부하를 줄이는 방법은?
대규모 데이터에서 테이블 변수를 써도 되나요?
임시 테이블과 CTE는 어떻게 다른가요?
📌 테이블 변수와 임시 테이블 선택의 핵심 요약
MSSQL에서 테이블 변수와 임시 테이블은 모두 임시 데이터를 다루는 강력한 도구입니다.
하지만 저장 위치, 인덱스 활용성, 통계 정보 갱신 여부 등에서 차이가 있으며, 그로 인해 성능과 용도가 달라집니다.
테이블 변수는 소규모 데이터, 짧은 범위의 연산, 트랜잭션 롤백 영향을 받지 않아야 하는 상황에서 적합합니다.
반면, 임시 테이블은 대규모 데이터, 복잡한 쿼리, 인덱스와 통계 활용이 필요한 경우 최적의 선택이 됩니다.
두 방법 모두 상황에 맞게 선택하고, 필요 시 성능 테스트를 거쳐 적용하는 것이 가장 안전한 접근입니다.
🏷️ 관련 태그 : MSSQL, 테이블변수, 임시테이블, 데이터베이스최적화, SQL성능, TempDB, 인덱스활용, 쿼리튜닝, 대량데이터처리, SQL팁