Oracle Database
Oracle Global Temporary Table
에너자이죠
2010. 12. 8. 14:54
임시 테이블은 사용자가 DML(update, insert, delete) 문을 실행한 후, 트랜젝션을 종료(commit)하면 변경된 데이터들이 테이블에 저장되지 않는 테이블이다. 어떤 응용을 개발할 때 데이터를 잠시 저장하는 변수와 같은 유형이다.
temporary table은 특정 session 또는 transaction 동안만 data를 저장한다.
on commit delete rows :
트랜젝션을 발생시킨 후, commit문을 실행할 때 없어지는 방법. 한 transaction 동안만 data를 저장(default임)
on commit preserve rows :
트랜젝션을 종료하면(commit) 테이블 내에 데이터가 저장되었다가 세션을 종료하면 임시 테이블에 저장되었던 데이터들이 모두 없어지는 방법. 한 session 동안만 data를 저장
temporary table은 다음과 같은 성격을 갖는다.
TABLE의 definition 정보는 data dictionary에 영구적으로 저장되지만, data는 일시적으로 저장된다.
CREATE로 TABLE 생성시 SEGMENT가 할당되는 것이 아니라 첫 번째 INSERT시 할당된다.
DML 작업시 해당 data에 대해 LOCK을 걸지 않는다.
data 변경시 redo log에 기록이 남지 않는다.
다음은 간단한 테스트 이다.
1. global temporary table 생성
SQL> create global temporary table gtt ( x int );
Table created.
2. object 생성 확인
SQL> select dbms_metadata.get_ddl( 'TABLE', 'GTT' ) from dual;
DBMS_METADATA.GET_DDL('TABLE','GTT')
--------------------------------------------------------------------------------
CREATE GLOBAL TEMPORARY TABLE "SCOTT"."GTT"
( "X" NUMBER(*,0)
) ON COMMIT DELETE ROWS
SQL> select object_name,object_type from user_objects where object_name = 'GTT';
OBJECT_NAME OBJECT_TYPE
------------------------------ ------------
GTT TABLE
SQL> select table_name from user_tables where table_name = 'GTT';
TABLE_NAME
------------
GTT
SQL> select table_name,temporary,duration from user_tables where table_name = 'GTT';
TABLE_NAME TEM DURATION
-------------------- --- ---------------------------------------------
GTT Y SYS$TRANSACTION
SQL> select segment_name from user_segments where segment_name = 'GTT';
no rows selected
SQL> drop table gtt;
Table dropped.
3. global temporary table 생성
SQL> create global temporary table gtt ( x int ) on commit preserve rows;
Table created.
4. object 생성 확인
SQL> select dbms_metadata.get_ddl( 'TABLE', 'GTT' ) from dual;
DBMS_METADATA.GET_DDL('TABLE','GTT')
--------------------------------------------------------------------------------
CREATE GLOBAL TEMPORARY TABLE "SCOTT"."GTT"
( "X" NUMBER(*,0)
) ON COMMIT PRESERVE ROWS
SQL> select object_name,object_type from user_objects where object_name = 'GTT';
OBJECT_NAME OBJECT_TYPE
------------------------------ -------------
GTT TABLE
SQL> select table_name from user_tables where table_name = 'GTT';
TABLE_NAME
--------------------
GTT
SQL> select table_name,temporary,duration from user_tables where table_name = 'GTT';
TABLE_NAME TEM DURATION
-------------------- --- ---------------------------------------------
GTT Y SYS$SESSION
SQL> select segment_name from user_segments where segment_name = 'GTT';
no rows selected
SQL> drop table gtt;
Table dropped.