본문 바로가기
IT/DB

[MSSQL] 임시테이블(@테이블,#테이블)

by 불멸남생 2023. 6. 20.

 

1. 임시 테이블 vs 테이블 변수

  임시 테이블(#Table) 테이블 변수(@Table) 
존재 기간 명시적으로 삭제를 안할 시에는 세션 연결 기간동안 존재  명시적으로 삭제를 안할 시에는 배치 처리기간 동안 존재 
저장소  Tempdb  Tempdb 
쿼리 비용  대용량에서는 쿼리 비용 유리  소용량에서 쿼리 비용 유리 
장점  - 통계정보 생성으로 대량 데이터 사용시 조회 성능이 빠름
- NON CLUSTER INDEX 사용으로 임시 테이블을 이용한 조인(Join)시 쿼리 성능을 높일 수 있음
- Transaction Overhead가 없음
- Lock Overhead가 없음
- Rollback Overhead가 없음
- 저장프로시저 안에서 사용시 저장프로시저 재컴파일 없음
단점  - Transaction Overhead가 있음
- Lock Overhead가 있음
- Rollback Overhead가 있음
- 저장프로시저 안에서 사용시 저장프로시저 실행 시마다 임시 테이블 사용 구문에 대해 재컴파일 발생(CPU 부하) 
- PK, UNIQUE 옵션을 통한 CLUSTER INDEX만 생성 가능
- 테이블의 각 컬럼에 대한 통계정보가 생성되지 않음
- 100건 이상 대량 데이터에서는 Sort작업 등으로 인한 성능 저하 발생
사용 Case  - INSERT되는 데이터가 100건 이상인 경우  - INSERT되는 데이터가 100건 이하, 1~2개 컬럼 사용시 적합
- 가능하면 PK 또는 UNIQUE 컬럼을 지정해서 데이터가 정렬된 형태로 저장하여 사용 
사용 예 * 생성
CREATE TABLE dbo.#Table (
    A INT IDENTITY(1,1), 
    B INT
)

* 입력 

INSERT INTO dbo.#Table VALUES(1)

* 검색 

SELECT * FROM dbo.#Table
 * 생성(선언)
DECLARE @T table (
    OrderID int identity(1,1) PRIMARY KEY NONCLUSTERED, 
    OrderDate datetime CHECK(OrderDate >= '1900-01-01')
)
 * 입력
INSERT INTO @T SELECT TOP 10 OrderDate FROM Orders 
 
* 사용
SELECT * FROM @T
 
UPDATE @T SET OrderDate = OrderDate + 1
 
DELETE @T WHERE OrderDate > '1996-07-10'
 
SELECT * FROM @T
 
GO

 

2. 임시 테이블 상세 설명

(1) 설명

- 임시 테이블의 테이블 이름은 숫자 기호(#)로 시작한다.

- 사용자가 연결이 끊겼을 때 임시 테이블이 삭제되지 않는 경우 SQL Server는 자동으로 임시 테이블을 삭제한다.

- 현재 설정된 데이터베이스에 저장되지 않고 시스템 데이터베이스 Tempdb에 저장된다. 단 데이터 건수가 작을 때는 메모리에만 존재 Tempdb 사이즈 증가 안 함(데이터가 29K 이하 일 때는 메모리에 존재)

 

(2) 형태

① 로컬 임시 테이블(Local Temporary Table)

- 하나의 숫자 기호(#)으로 시작함.

- 이 테이블은 테이블을 만든 연결에서만 볼 수 있음.

 

② 전역 임시 테이블(Global Temporary Table)

- 두개의 숫자 기호(##)으로 시작함.

- 이 테이블을 만든 연결이 끊어지기 전에 이 테이블이 명시적으로 삭제되지 않으며, 다른 모든 작업이 이 테이블에 대한 참조를 중지할 때 바로 삭제된다.

 

(3) 장점

① 인덱스를 작성할 수 있다.

② FK(외래키)를 제외한 나머지 제약을 지정할 수 있다.

③ 테이블은 작성이 되지만 경고 메시지와 함께 FK 선언은 제외된다.

④ ALTER TABLE이 가능하다.

⑤ INSERT INTO, BULK INSERT 문과 함께 사용할 수 있다.

 

3. 테이블 변수

(1) 설명

SQL Server 2000 버전에서 새로 추가된 형식으로 임시 테이블을 만들어 사용하는 것과 비슷한 역할을 수행함.

테이블 변수는 테이블 변수가 정의된 함수 및 저장프로시저 및 일괄 처리가 끝나면 자동으로 정리됨.

- 테이블 변수와 관련된 트랜잭션은 테이블 변수가 업데이트되는 동안만 지속됨. 따라서 테이블 변수를 사용하면 리소스 잠금과 로깅에 대한 요구가 줄어듦.

 

(2) 장점

① Primary Key(기본키), UNIQUE(유일키), CHECK 제약을 쓸 수 있다.

② IDENTITY(식별자) 속성을 지정할 수 있다.

③ SELECT, INSERT, UPDATE, DELETE 문에 사용할 수 있다.

 

(3) 제약사항

① FK를 사용할 수 없다.

② ALTER TABLE를 할 수 없다.

③ 추가 인덱스를 선언할 수 없다. 그러나 PK, UNIQUE가 있다.

④ 로컬 변수나, UDF 안에서만 사용된다.

반응형

'IT > DB' 카테고리의 다른 글

REGEXP_LIKE() 함수 정리  (1) 2024.01.25
[Tibero] 한글,영문, 숫자 정렬 하기.  (0) 2024.01.25
[티베로] MERGE 사용  (0) 2023.04.26
TIBERO에서 사용되는 WITH 절(인라인뷰 대신)  (0) 2023.04.24
mssql vs tibero 타입/함수 비교  (0) 2023.03.15