insert 中append 用法詳解
總結:
關於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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8109090/viewspace-1057546/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- insert /*+ append */ into 與insert into 的區別APP
- STL中set用法詳解
- STL中map用法詳解
- insert /*+ append */直接路徑插入APP
- mysql中last_insert_id()用法MySqlAST
- java中printf中用法詳解Java
- Java中jar命令用法詳解JavaJAR
- 關於insert /*+ append*/ 各種insert插入速度比較APP
- nologging和insert /*+append*/APP
- Append與Direct-Path Insert(一)APP
- Append與Direct-Path Insert(二)APP
- 直接路徑插入 -- insert /*+append*/ into [zt]APP
- MySQL中BETWEEN子句的用法詳解MySql
- 詳解MySQL中WHERE子句的用法MySql
- Java 中 this 和 super 的用法詳解Java
- ES6中Promise用法詳解Promise
- C++ 中 this 指標的用法詳解C++指標
- PHP中return用法詳細解讀PHP
- php中mysql操作buffer用法詳解PHPMySql
- Android中的ANR用法詳解Android
- Android中Context用法詳解AndroidContext
- insert append需要注意的問題APP
- 如何讓insert /*+ append */ 採用並行。APP並行
- Python中insert用法及實戰案例!Python
- AngularJS select中ngOptions用法詳解AngularJSGo
- 轉:SVN中trunk,branches,tags用法詳解
- 詳解Vue中watch的高階用法Vue
- oracle中的exists 和not exists 用法詳解Oracle
- [Oracle] Append hint(insert sql) will lead a TM LOCKOracleAPPSQL
- CTAS和insert append的一個測試APP
- insert /*+ append */於report unrecoverable命令實驗。APP
- 關於insert /* append */的幾點註記APP
- extern用法詳解
- Metasploit用法詳解
- xargs用法詳解
- Nmap用法詳解
- mount用法詳解
- LL圖文詳解mysql中with...as用法huxMySqlUX