insert 中append 用法詳解

itpub120發表於2012-03-08

總結:
關於Nologging與append測試的一些總結,透過上面的SQL語句檢視可以得出在大量資料插入過程的語句中加入/*+append*/的這個SQL語句產生的REDO日誌明顯示是會少同時時間節約了很多,當然這樣可能會影響備份因此nologging載入資料後要做一個資料庫的全備。

insert append並不是在任何時候都可以節省時間的以下是測試的一些總結:

第一種情況:

database為archivelog狀態,這種情況下,就算你用insert append也是不一定提高插入效率的。但是如果你將目標表設定為nologging,然後再使用insert append就會很快。
第二種情況:

database為noarchivelog狀態,如果在這種情況下直接採用insert方法而不加入append向表中插入資料,佔用的redo空間的大小與archivelog狀態下佔用的大小是相當的,不論表是否為nologging。但是如果採用insert append方法的話,透過redo的佔用值大家可以發現,不論表是否為nologging,所佔用的redo的大小都是很小的。也就說明:在資料庫為noarchivelog的狀態下,採用insert append方法,如果表不是nologging,系統也會自動將錶轉換為nologging(即在執行insert append之前,先執行一個alter table arch1 nologging)。
第三種情況:

如果表上有索引,則append方式批次新增記錄,不會減少索引上產生的redo數量,索引上的redo數量可能比表的redo數量還要大。用insert append可以實現直接路徑載入速度是快很多,但有一點需要注意: insert append時在表上加”6”型別的鎖,會阻塞表上的所有DML語句,因此在有業務執行的情況下要慎重使用。若同時執行多個insert append對同一個表並行載入資料,並不一定會提高速度,因為每一時刻只能有一個程式在載入(排它鎖造成)à此觀點是在網上查到的對於此疑問對於鎖的問題此兄弟可能不是太理解,對於ORACLE資料庫來說只要DML特別是insert操作他肯定會將表給鎖住而且是獨佔鎖除非進行commit,rollback,及其它的DDL操作來釋放否則鎖會一直獨佔導致其它的DML操作無法進行正常的操作,而跟所謂的APPEND無關。

以下是關於表模式(LOGGING/NOLOGGING),插入模式(APPEND/NOAPPEND),資料庫執行模式(歸檔/非歸檔),REDO日誌產生的關係


資料庫模式
表模式
插入模式
REDO生成

ARCHIVELOG
LOGGING
APPEND
有REDO

NO APPEND
有REDO

NOLOGGING
APPEND
無REDO

NO APPEND
有REDO

NOARCHIVELOG
LOGGING
APPEND
無REDO

NO APPEND
有REDO

NOLOGGING
APPEND
無REDO

NO APPEND
有REDO

[@more@]

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

相關文章