커피와 개발자

[Oracle]TEMPORARY TABLE 본문

데이터베이스/Oracle

[Oracle]TEMPORARY TABLE

광박이 2022. 10. 11. 16:11
728x90

TEMPORARY TABLE은 하나의 세션 동안이나 트랜젝션(COMMIT 하기 전) 동안 임시적으로 데이터를 보관하기 위해 제공된다.

세션이나 트랜젝션이 종료되면 테이블의 데이터는 TRUNCATE 된다.

일반 테이블과 다르게 테이블의 레이아웃은 dictionary에 존재하지만 데이터는 디스크 상에 존재하지 않고 메모리상에서 [INSERT] [UPDATE] [DELETE] [SELECT] 하는 테이블이다.


TEMPORARY TABLE syntax 

CREATE GLOBAL TEMPORARY TABLE [테이블명]

    ON COMMIT [DELETE|PRESERVE] ROWS;

ON COMMIT PRESERVE ROWS : 세션별로 데이터가 존재 (세션이 종료 시 데이터 소실)

ON COMMIT DELETE ROWS : 트랜젝션별로 데이터 존재  (COMMIT 하면 데이터 소실)

 

1. TEMPORARY TABLE CREATE

-- Session-Level Temporary 생성 예제

SQL>

CREATE GLOBAL TEMPORARY TABLE TBL1

(

    ID      NUMBER

,   NM      VARCHAR2(10)

,   DT      DATE

) ON COMMIT PRESERVE ROWS;

-- Transaction-Level Temporary 생성 예제
SQL>

CREATE GLOBAL TEMPORARY TABLE TBL2

(

    ID       NUMBER

,   NM       VARCHAR2(10)

,   DT       DATE

) ON COMMIT DELETE ROWS;

 

 

SQL>

SELECT  TABLE_NAME

,       DURATION

FROM    USER_TABLES

WHERE   TEMPORARY   = 'Y'

AND     TABLE_NAME IN ('TBL1', 'TBL2');

 

-- 결과

TABLE_NAME | DURATION

------------------------------

TBL1          | SYS$SESSION

TBL2          | SYS$TRANSACTION

SYS$SESSION : 세션이 종료되면 데이터 소실

SYS$TRANSACTION : 트랜젝션이 종료되면 데이터 소실

 

-- 하나의 임시 테이블은 더로 다른 사용자가 접근이 가능하다. 하지만 데이터는 서로 다르다.

-- 자신의 SID를 조회

SQL>

SELECT SID FROM V$MYSTAT WHERE ROWNUM = 1;

 

-- 결과

       SID

----------

       962

 

2. TEMPORARY TABLE DATA INSERT OR UPDATE

-- Data Insert

SQL>

INSERT INTO TBL1(ID, NM, DT) VALUES(1, '홍길동', SYSDATE);

 

-- Data Select (이때 다른 세션에서 조회하면 데이터가 존재하지 않는다.)

SQL> SELECT * FROM TBL1 ;

 

-- 결과

ID  | NM       | SYSDATE

-------------------------------------

1   | 홍길동   | 2015/09/25 10:52:04

 

-- 트랜젝션으로 설정한 경우 COMMIT 하는 순간 데이터가 사라짐

-- 다른 사용자가 접속한 경우도 데이터는 보이지 않는다.

SQL>

COMMIT;

 

-- 세션으로 설정한 경우 Exit하는 경우 데이터가 사라짐

-- 다른 세션으로 접속한 경우도 데이터는 보이지 않는다.

SQL> EXIT

 

TEMP TABLE도 일반 TABLE처럼 INSERT 또는 UPDATE 할 때 Lock을 잡는다.

Lock을 조회하면 조회된다.

 

* 중요

테이블의 definition 은 dictionary 에 저장된다.

하지만 SELECT TABLESPACE_NAME FROM DBA_TABLES; 를 조회해 보면 조회되지 않는다.

테이블의 정보는 dictionary (owner의 DEFAULT_TABLESPACE)에 저장되지만 실 데이터는 디스크에 저장되지 않고 메모리상에서 소멸되기 때문이다.

 

3. TEMPORARY TABLE DELETE

DROP TABLE T1 ;

DROP TABLE T2 ;

 

728x90
Comments