[Oracle] 전역 임시 테이블 (Global Temporary Table)
안녕하세요. 갓대희 입니다. 이번 포스팅은 [ 오라클 임시 테이블 ] 입니다. : )
전역 임시 테이블 (Global Temporary TABLE)
[정의 및 특징]
- SESSION(또는 TRANSACTION) 레벨의 임시 데이터를 저장하는 용도
(오라클의 실행 계획을 저장하기 위한 Plan 테이블이 전역 임시 테이블의 대표적인 사례)
- SESSION(또는 TRANSACTION) 레벨의 임시 데이타 저장하기 때문에 RAC 시스템에서 글로벌 동기화 불필요
- DML LOCK 필요없음 (세션 DATA 간 경합이 발생하지 않기 때문)
- REDO LOG 발생 안함 (임시 DATA 이므로 DML문이라도 redo log 발생 하지 않음)
1. 문법
EX1) TRANSACTION 단위 DATA 유지
- ON COMMIT DELETE ROWS
CREATE GLOBAL TEMPORARY TABLE TEST_TEMPORARY (
TEST_NO NUMBER(20)
)
ON COMMIT DELETE ROWS; -- 기본옵션, commit시 데이터 삭제(종료시에도 삭제)
INSERT INTO TEST_TEMPORARY VALUES (1);
INSERT INTO TEST_TEMPORARY VALUES (2);
SELECT * FROM TEST_TEMPORARY;
- 테이블 생성 후 데이터 입력 후 조회하면 위와 같이 데이터를 확인 할 수 있다.
- Transaction 단위 데이터 유지되는 옵션을 사용 한 테이블 이기 때문에 COMMIT;을 입력하면 오히려 데이터가 소실된다.
COMMIT;
SELECT * FROM TEST_TEMPORARY;
EX2) SESSION 단위 DATA 유지
- ON COMMIT PRESERVE ROWS
CREATE GLOBAL TEMPORARY TABLE TEST_TEMPORARY2 (
TEST_NO NUMBER(20)
) ON COMMIT PRESERVE ROWS;
INSERT INTO TEST_TEMPORARY2 VALUES (1);
INSERT INTO TEST_TEMPORARY2 VALUES (2);
SELECT * FROM TEST_TEMPORARY2;
- Session 단위 데이터 유지되는 옵션을 사용 한 테이블 이기 때문에 COMMIT;을 입력해도 데이터가 유지된다.
COMMIT;
SELECT * FROM TEST_TEMPORARY2;
- 하지만 다른 세션(신규 접속 해보자)에서 해당 데이터를 조회 하면 데이터가 없다.
- 즉 테이블 정의는 모든 세션에서 볼 수 있으나 DATA는 세션별로 독립적이기 때문에 다른 session에서 접근할 수 없음
2. INDEX, VIEW, TRIGGER 생성 가능
- 단 COLUMN에 생성되는 INDEX도 TEMPORARY TYPE
EX1) TEMPORARY TABLE 에 대해서 INDEX 생성 하기
CREATE UNIQUE INDEX TEST_TEMPORARYON_PK ON TEST_TEMPORARY ( TEST_NO ) ;
EX2) TEMPORARY TABLE 에 대해서 PRIMARY KEY 설정 하기
ALTER TABLE TEST_TEMPORARY ADD ( CONSTRAINT TEST_TEMPORARY_PK ( TEST_NO )) ;
3. ORACLE VS MS-SQL
- 세션이 종료됨과 동시에 임시 테이블 스키마가 날아가지만 오라클은 테이블 스키마는 남아있다.
- MS-SQL에서 전역 임시테이블(##)은 타 세션 공유 가능
4. TABLE 정보는 유지된다.
확인 )
SELECT A.TABLE_NAME 테이블명, A.TEMPORARY 임시테이블유무, A.DURATION 세션_Data_유지기간, A.TABLESPACE_NAME AS 테이블스페이스명
FROM USER_TABLES A
WHERE TEMPORARY = 'Y';
※ TABLESPACE_NAME(테이블 스페이스명)이 조회되지 않는데
그 이유는 테이블의 정보는 DICTIONARY(owner의 DEFAULT_TABLESPACE)에 저장되지만
실 데이터는 DISK에 저장되지 않고 메모리상에서 소멸되기 때문에
데이터를 저장하는 TABLESPACE가 무의미 하다.
5. 삭제 시 사용 중인 세션에서 삭제 불가
DROP TABLE TEST_TEMPORARY2;