Oracle Direct-Path Insert

tolywang發表於2007-12-07
(1)、Oracle插入資料有兩種方式:
a、常規插入:重新使用table中的自由空間,在已有資料中插入新資料;維護引用完整性約束。
b、Direct-Path插入:在表中已有資料之後插入新資料;資料直接插入資料檔案,繞過buffer cache;已有資料中的自由空間沒有被重新利用;忽略了引用完整性約束。

(2)、連續模式:一個程式執行sql語句;
並行模式:多個程式同時執行一個sql語句,即並行執行。
(3)Direct-Path插入的優點:
1、可以disable redo log和undo log;而常規插入卻不可以如此,並且重用自由空間和維護引用完整性。
2、透過CREATE TABLE...AS SELECT 語句可以從現有表中建立新表,使用Direct-Path插入可以在插入時更新定義在目標表上的任意索引。
3、Direct-Path插入能保證事務的原子性,即使在並行模式下。使用SQL*Loader在並行模式載入中不能保證原子性。
4、當並行Direct-Path載入發生錯誤時,索引被標誌成UNUSABLE。
5、如果想使用表壓縮的壓縮格式儲存資料,必須使用Direct-Path插入。
(4)使用Direct-Path插入:
在連續模式中,在Insert語句中指定“APPEND”提示,在INSERT關鍵字之後,或者在INSERT子查詢中的SELECT關鍵字之後。
在並行DML模式中,預設的就是DIRECT-PATH插入,為了執行並行DML模式,必須滿足以下條件:
a、必須是Oracle企業版;
b、必須在session中使並行DML生效,執行以下sql語句:
ALTER SESSION { ENABLE | FORCE } PARALLEL DML;
c、必須指定table的並行屬性,在建立的時候或者其他時候,或者在insert操作時使用“PARALLEL”提示。
為了使Direct-Path Insert模式失效,在INSERT語句中指定“NOAPPEND”提示,覆蓋並行DML模式。
(5)、Direct-Path INSERT 是如何工作的
在分割槽表和非分割槽表都可以使用Direct-Path INSERT
連續Direct-Path INSERT到分割槽和非分割槽表
單個程式插入資料到高水位標誌之上,當執行完commit之後,高水位標誌得到更新。
並行Direct-Path INSERT到分割槽表
類似於serial Direct-Path INSERT,每個並行操作分配給一個或者多個分割槽,每個並行操作插入資料到各自的分割槽段的高水位標誌之上,commit之後,使用者就能看到更新的資料。
並行Direct-Path INSERT到非分割槽表
每個並行執行分配一個新的臨時段,並插入資料到臨時段。當commit執行後,並行執行協調者合併新的臨時段到主表段,使用者就能看到更新的資料。
為Direct-Path INSERT指定的Log模式
Direct-Path INSERT可以使用Log或者不使用Log。
(6)、其他需要注意的地方:
索引維護:Oracle在Direct-Path INSERT 操作末尾,對具有索引的表執行索引維護,這樣就避免了在drop掉索引後,再rebuild。
使用的空間:Direct-Path INSERT比常規的插入需要更多的空間。因為它將資料插入在高水位之上。並行插入非分割槽表需要更多的空間,因為它需要為每一個並行建立臨時段。
鎖:在插入期間,資料庫在表上獲得排他鎖,使用者不能在表上執行並行插入、更新或者刪除操作,並行的索引建立和build也不被允許。但卻可以並行查詢,但查詢返回的是插入之前的結果集。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-85084/,如需轉載,請註明出處,否則將追究法律責任。

相關文章