임시 테이블은 사용자가 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.
'Oracle Database' 카테고리의 다른 글
Oracle 11g의 새로운 HINT : IGNORE_ROW_ON_DUPKEY_INDEX (0) | 2010.12.23 |
---|---|
Oracle Interval Partition drop할때 ORA-14758 발생 (0) | 2010.12.08 |
오라클 테스트 환경 만들기 (0) | 2010.11.29 |
Oracle Begin backup에 대한 몇몇 궁금한 사항. (0) | 2010.11.25 |
Oracle LOCAL INDEX DROP 하는 방법 (0) | 2010.11.23 |