DATOR


INSERT 유형 SQL가이드


 

INSERT유형에 대해 정리하다가 DIRECT-PATH INSERT에 대한 개념을 쉽게 이해할 수 있는 그림이 없어서 제 나름 정리된 개념을 적고 그림으로 표현해보았습니다.

 

 

CONVENTIONAL INSERT
1.Freelist를 조회하면서 Random 액세스 방식으로 버퍼 캐시에서 해당 블록을 찾고, 

  없으면 데이터파일에서 읽어 캐시에 적재한 후에 데이터를 삽입하므로 대량 데이터 INSERT시 매우 느림.

  적은 수의 데이터를 Insert할 때는 훨씬 효율적.
2. Logical I/O만으로 원하는 작업을 수행
3. 참조무결성 검증 함.

 


DIRECT-PATH INSERT
1.SGA의 buffer cache를 거치지 않고 직접 Oracle data를 구성하고 입력.
  대량 데이터 INSERT시 유리   
  Direct Path Insert시에는 Freelist를 참조하지 않고 테이블 세그먼트 또는 각 파티션 세그먼트의 HWM바깥 영역에 데이터를 순차적으로 입력한다.
  Direct Path Insert에서는 Redo와 Undo 엔트리를 로깅하지 않도록 옵션을 줄 수도 있어 훨씬 빠르다.

2. 참조무결성 검증 안함

    1) Serial Direct-Load Insert
    2) Parallel Direct-Load Insert into a nonpartitioned table
    3) Parallel Direct-Load Insert into a partitioned table

 

 

* CONVENTIONAL INSERT와 DIRECT-PATH INSERT 구조 비교

 IMG.gif

- 사용자의 쿼리가 풀 테이블 스캔을 발생시키는 경우, 오라클은 (설사 관련된 데이타가 전혀 존재하지 않는 경우라 하더라도) HWM 아래쪽의 모든 영역을 스캔합니다.

  이로 인해 풀 테이블 스캔에 소요되는 시간이 길어질 수 있습니다.
-
로우가 direct path 정보와 함께 insert 되는 경우 (예를 들어 APPEND 힌트를 사용한 Insert, 또는 SQL*Loader direct path를 통해 insert 되는 경우)

  새로 추가되는 데이타 블록은 HWM의 위쪽 영역에 추가됩니다. 따라서 HWM의 아래쪽 영역은 낭비된 채로 남게 됩니다.

 

 

* 10/11g 비교

Oracle 10g

Oracle 11gR1

Oracle 11gR2

INSERT /*+ append */ INTO  TAB1 SELECT ~

INSERT /*+ append */  INTO TAB1 VALUES~

INSERT /*+ append_values */  INTO TAB1 VALUES~

 

 

-----------------------   아래 글은 퍼온 글입니다.(어느 블로그인지? 카페에서 본 글인데 어딘지 링크를 잊어버렸네요)   ---------------------------

한건의 로우(Row)를 Insert하는데 APPEND 힌트를 이용한 Direct Path Mode가 필요한지는 잘 모르으나 , 오라클은 11g부터 이러한 모드를 지원하기로 했습니다.
즉 INSERT ... VALUES ... 구문에서도 APPEND 힌트가 동작하도록 수정되었습니다.

Oracle 10g까지는 INSERT ... VALUES ... 구문에 APPEND 힌트를 부여해도 무시됩니다. 즉, APPEND 힌트는 INSERT ... SELECT 구문에서만 동작합니다.
APPEND 힌트로 인해 Direct Path Mode로 동작하면 로우를 Insert할 때 현재 세그먼트의 Free Block을 무시하고(동시에 Buffer Cache를 경유하지 않고)

세그먼트의 High Water Mark 뒤에 Append 시켜버립니다.

따라서 대량의 데이터를 추가할 때 속도는 빠르지만 데이터 파일에 그만큼 불필요한 빈공간이 남아있을 수는 있습니다.

(하지만 이 빈공간도 언젠가는 사용될 것입니다)
Oracle 11gR1에서는 INSERT ... VALUES ... 구문에서도 APPEND 힌트가 동작합니다. 히든 파라미터 _direct_path_insert_features에 의해 제어됩니다.
Oracle 11gR2에서는 INSERT ... VALUES ... 구문에서 APPEND 힌트를 부여해도 무시됩니다(응?). 대신 APPEND_VALUES 라는 힌트가 추가되었습니다.

즉 APPEND_VALUES 힌트를 사용하면 INSERT ... VALUES ... 구문에서도 Direct Path Mode로 Insert가 이루어집니다.  

Tag :

Leave Comments