ORACLE Tip2009. 1. 30. 11:39


ON COMMIT PRESERVE ROWS 에 대해서 찾아보다가 알게된 내용이다.

[[ TEMPORARY TABLE(임시 테이블) ]]

1. 설명
   개발자가 DML(INSERT, UPDATE, DELETE)문을 실행한 후 트랜젝션을 종료(commit)하더라도
   변경된 테이터들이 DB테이블에 저장되지 않는 테이블이다.
   즉, 잠시 데이터를 저장하는 일시적 공간

2. 데이터를 유지하는 방법
   (1) ON COMMIT DELETE ROWS
      commit문을 실행할 때 '데이터'가 없어지는 옵션 즉, 하나의 트랜젝션이 마무리될 때 함께 데이터가 없어진다.
   (2) ON COMMIT PRESERVE ROWS
      commit문이 실행되면 임시테이블내에 데이터가 저장되었다가 세션을 종료하면 임시테이블에 저장되었던
      '데이터'들이 없어지는 옵션 즉, 하나의 세션이 마무리될 때 함께 데이터가 없어진다.

흠.. 이런것이 있었군.

발췌 : oracle forum

TEMPORARY TABLE IN ORACLE8I
===========================
Oracle8.1에서는 session내에서 임시로 사용할 data들을 영구적인 segment형태가 아닌 temporary structure에서 관리할 수 있다.
이러한 Temporary Table들은 그 생성문장에 의해서 definition이 dictionary에 저장되고, 각 session에서 해당 table을 사용할 때마다 definition을 이용하여 memory에 table 구조를 생성하게 된다.

CHARACTERISTICS
-------------------
1. data는 session private하다.
   (특정 session에서 사용하는 temporary table data는 다른 session에서 access할 수 없다.)
2. CREATE GLOBAL TEMPORARY TABLE ...
   ON COMMIT [DELETE|PRESERVE] ROWS ; 문을 이용하여 생성한다.
3. data의 유지기간은 transaction단위 또는 session단위이다.
   'ON COMMIT DELETE ROWS'로 생성되었다면 transaction단위이며
   이때 data는 commit이 되는 시점에 자동으로 제거된다.
   'ON COMMIT PRESERVE ROWS'로 생성되었다면 session단위이며
   이때 data는 해당 session이 종료되면서 사라진다.
   default는 'ON COMMIT DELETE ROWS'이다.
4. table의 definition은 dictionary에 permanently 저장된다.
   *_tables의 TEMPORARY, DURATION column이 temporary table과 관련이 있다.
   TEMPORARY - 'Y' : temporary type table
                         'N' : permanent type table
   DURATION  - 'SYS$SESSION'          : data의 유지기간이 session단위
                       'SYS$TRANSACTION' : data의 유지기간이 transaction단위
                        NULL                       : 해당 table은 temporary type이 아님
5. session간에 data에 대한 contention이 발생되지 않기 때문에 DML문에 대한 lock이 필요하지 않다.
6. 임시적으로만 관리되는 data이므로 DML문에 대해서 redo log를 발생시키지 않는다.
7. index, view, trigger를 생성하여 사용할 수 있다.
   Temporary Table의 column에 생성되는 index도 temporary type이다.
8. table의 definition은 export utility를 이용하여 export할 수 있다. 그러나 그 row들은 export의 대상이 될 수 없다.

RESTRICTIONS
---------------
1. partitioned, index-organized, clustered table로 생성할 수 없다.
2. foreign key constraint를 설정할 수 없다.
3. nested table이나 varray type의 column은 포함할 수 없다.
4. 다음과 같은 LOB_storage_clause들은 지정할 수 없다. : TABLESPACE,
   storage_clause, LOGGING 또는 NOLOGGING, MONITORING 또는 NOMONITORING, 또는 LOB_index_clause.
5. parallel DML이나 parallel query는 지원되지 않는다. 
   (parallel hint는 무시될 것이며, table생성시 parallel clause를 지정하면 error를 return한다.)
6. storage나 tablespace는 지정할 수 없다.
7. 분산 transaction은 지원되지 않는다.

SAMPLE
---------
----------------------------------------------------------------------
-- temporary type table을 생성하되 duration은 transaction단위로 한다.
----------------------------------------------------------------------
SQL> create global temporary table temp_tab
  2  (col1 number, col2 char(10))
  3  on commit delete rows ;

-----------------------------------------------------------------------
-- 생성된 table에 대한 정보를 조회한다. *_tables의 TEMPORARY, DURATION
-- column이 temporary type table과 관련이 있다.
-----------------------------------------------------------------------
SQL> select temporary, duration
  2  from user_tables
  3  where table_name = 'TEMP_TAB' ;
T DURATION
- ---------------
Y SYS$TRANSACTION

-----------------------------------------------------------------------
-- temporary table에 row insert
-----------------------------------------------------------------------
SQL> insert into temp_tab values (1, 'wookpark') ;
SQL> select * from temp_tab ;
     COL1 COL2
--------- ----------
        1 wookpark

-----------------------------------------------------------------------
-- transction을 commit한다.
-----------------------------------------------------------------------
SQL> commit ;
Commit complete.

-----------------------------------------------------------------------
-- duration이 transaction단위이기 때문에 commit을 수행하면 모든 data가
-- 사라진다.
-----------------------------------------------------------------------
SQL> select * from temp_tab ;
no rows selected

Posted by 항아리고미