새소식

300x250
3. Database/Oracle 기본

[Oracle] 전역 임시 테이블 (Global Temporary Table)

  • -
728x90

[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;






300x250
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.