Oracle Direct-Path Insert學(xué)習(xí)筆記
Posted on 2006-11-14 09:22 勇敢的心 閱讀(2465) 評論(0) 編輯 收藏 所屬分類: Oracle(1)、Oracle插入數(shù)據(jù)有兩種方式:
a、常規(guī)插入:重新使用table中的自由空間,在已有數(shù)據(jù)中插入新數(shù)據(jù);維護引用完整性約束。
b、Direct-Path插入:在表中已有數(shù)據(jù)之后插入新數(shù)據(jù);數(shù)據(jù)直接插入數(shù)據(jù)文件,繞過buffer cache;已有數(shù)據(jù)中的自由空間沒有被重新利用;忽略了引用完整性約束。
?
(2)、連續(xù)模式:一個進程執(zhí)行sql語句;
?????? 并行模式:多個進程同時執(zhí)行一個sql語句,即并行執(zhí)行。
?
(3)Direct-Path插入的優(yōu)點:
1、可以disable redo log和undo log;而常規(guī)插入?yún)s不可以如此,并且重用自由空間和維護引用完整性。
2、通過CREATE TABLE...AS SELECT 語句可以從現(xiàn)有表中創(chuàng)建新表,使用Direct-Path插入可以在插入時更新定義在目標表上的任意索引。
3、Direct-Path插入能保證事務(wù)的原子性,即使在并行模式下。使用SQL*Loader在并行模式加載中不能保證原子性。
4、當并行Direct-Path加載發(fā)生錯誤時,索引被標志成UNUSABLE。
5、如果想使用表壓縮的壓縮格式存儲數(shù)據(jù),必須使用Direct-Path插入。
?
?
(4)使用Direct-Path插入:
?
在連續(xù)模式中,在Insert語句中指定“APPEND”提示,在INSERT關(guān)鍵字之后,或者在INSERT子查詢中的SELECT關(guān)鍵字之后。
在并行DML模式中,默認的就是DIRECT-PATH插入,為了運行并行DML模式,必須滿足以下條件:
a、必須是Oracle企業(yè)版;
b、必須在session中使并行DML生效,執(zhí)行以下sql語句:
ALTER SESSION { ENABLE | FORCE } PARALLEL DML;
c、必須指定table的并行屬性,在創(chuàng)建的時候或者其他時候,或者在insert操作時使用“PARALLEL”提示。
?
為了使Direct-Path Insert模式失效,在INSERT語句中指定“NOAPPEND”提示,覆蓋并行DML模式。
?
(5)、Direct-Path INSERT 是如何工作的
?
在分區(qū)表和非分區(qū)表都可以使用Direct-Path INSERT
?
連續(xù)Direct-Path INSERT到分區(qū)和非分區(qū)表
? 單個進程插入數(shù)據(jù)到高水位標志之上,當執(zhí)行完commit之后,高水位標志得到更新。
?
并行Direct-Path INSERT到分區(qū)表
? 類似于serial Direct-Path INSERT,每個并行操作分配給一個或者多個分區(qū),每個并行操作插入數(shù)據(jù)到各自的分區(qū)段的高水位標志之上,commit之后,用戶就能看到更新的數(shù)據(jù)。
?
并行Direct-Path INSERT到非分區(qū)表
? 每個并行執(zhí)行分配一個新的臨時段,并插入數(shù)據(jù)到臨時段。當commit運行后,并行執(zhí)行協(xié)調(diào)者合并新的臨時段到主表段,用戶就能看到更新的數(shù)據(jù)。
?
為Direct-Path INSERT指定的Log模式
?? Direct-Path INSERT可以使用Log或者不使用Log。
?
(6)、其他需要注意的地方:
??? 索引維護:Oracle在Direct-Path INSERT 操作末尾,對具有索引的表執(zhí)行索引維護,這樣就避免了在drop掉索引后,再rebuild。
??? 使用的空間:Direct-Path INSERT比常規(guī)的插入需要更多的空間。因為它將數(shù)據(jù)插入在高水位之上。并行插入非分區(qū)表需要更多的空間,因為它需要為每一個并行創(chuàng)建臨時段。
??? 鎖:在插入期間,數(shù)據(jù)庫在表上獲得排他鎖,用戶不能在表上執(zhí)行并行插入、更新或者刪除操作,并行的索引創(chuàng)建和build也不被允許。但卻可以并行查詢,但查詢返回的是插入之前的結(jié)果集。