insert /*+ append */直接路徑插入
相比於傳統的插入方式,append hints進行insert叫做直接路徑載入插入。其具體的語法如下:
insert /*+ append */
【優缺點】
1. append方式插入資料效率較高,尤其對於大資料量的載入,append效率提高明顯。
2. append方式會直接將新資料插入到表的高水位線以上,沒有充分利用現有空閒空間,因此會造成一定空間上的浪費,尤其對於經常delete的表空間浪費顯得更為突出。
3. 相比常規插入,資料庫在no force_logging模式下append會產生少量的undo資料。
4. insert /*+ append */ into table_name select語句若未commit提交,會造成同一會話無法查詢表。
5. append+nologging方式會產生更少的redo
6. append方式會忽略參照完整性約束
對於以上觀點如有不妥,還請指正。
【實驗】
-
insert append未提交,同一會話無法查詢情況
點選(此處)摺疊或開啟
-
create table t(id number);
-
insert into t select 1 from dual;
-
SELECT * FROM t;
-
ID
-
----------
-
1
-
-
insert /*+ append */ into t select 1 from dual;
-
SELECT * FROM t;
-
SELECT * FROM t
-
*
-
ERROR at line 1:
- ORA-12838: cannot read/modify an object after modifying it in parallel
可以看到insert /*+ append */ into t select 1 from dual命令沒有commit,同一會話查詢t表會報錯。
-
undo使用情況
點選(此處)摺疊或開啟
-
SELECT force_logging FROM v$database;
FORCE_LOGGING
------------------------------
NO -
create table t1 as select * from dba_objects;
-
create table t2 as select * from dba_objects where 1=0;
-
create table t3 as select * from dba_objects where 1=0;
- //常規方式插入
- insert into t2 select * from t1;
- SELECT sq.SQL_TEXT,t.USED_UBLK FROM v$transaction t,v$session se,v$sql sq where se.TADDR=t.ADDR and se.sql_id=sq.sql_id;
-
SQL_TEXT USED_UBLK
-
------------------------------- ----------
- insert into t2 select * from t1 29
- //直接路徑插入
-
insert /*+ append */ into t3 select * from t1;
- SELECT sq.SQL_TEXT,t.USED_UBLK FROM v$transaction t,v$session se,v$sql sq where se.TADDR=t.ADDR and se.sql_id=sq.sql_id;
-
SQL_TEXT USED_UBLK
-
------------------------------------------------------------ ----------
- insert /*+ append */ into t3 select * from t1 1
-
redo產生情況
點選(此處)摺疊或開啟
-
create table test1 as select * from dba_objects;
-
create table test2 as select * from dba_objects where 1=0;
- create table test3 as select * from dba_objects where 1=0;
常規方式插入:
插入前關於SID=50的redo size資料:
點選(此處)摺疊或開啟
- select name, value from v$sesstat s, v$statname n where n.statistic# = s.statistic# and upper(name) like upper('%redo size%') and s.sid=50;
-
NAME VALUE
-
----------------------------------- ----------
- redo size 41014992
點選(此處)摺疊或開啟
- select name, value from v$sesstat s, v$statname n where n.statistic# = s.statistic# and upper(name) like upper('%redo size%') and s.sid=50;
-
NAME VALUE
-
----------------------------------- ----------
- redo size 47743616
下面對錶t2,t3設定為nologging
點選(此處)摺疊或開啟
-
alter table test2 nologging;
- alter table test3 nologging;
insert into test2 select * from test1 6.3M
insert /*+ append */ into test3 select * from test1; 8k
直接路徑插入生成的redo大大較少,僅為8k
非歸檔模式:
logging:
insert into test2 select * from test1 6.4M
insert /*+ append */ into test3 select * from test1; 15k
nologging:
insert into test2 select * from test1 6.38M
insert /*+ append */ into test3 select * from test1; 13.8k
對歸檔/非歸檔模式,nologging/loggingce列個表格進行對比:
|
非歸檔+表logging |
非歸檔+表nologging |
歸檔+表logging |
歸檔+表nologging |
常規插入 |
6.4M |
6.38M |
6.4M |
6.4M |
直徑路徑插入 |
15k |
13.8k |
6.4M |
8k |
在非歸檔模式下,insert /*+ append */無論表是否設定為nologging,相比常規插入都會生成極小的redo;歸檔模式下,結合nologging才會較少redo的產生。
【總結】
縱然insert /*+ append */在某些情況下能夠減少undo的使用,會生成極少的redo資料,但此方式也會帶來一些問題,請在生產環境下結合具體的情況來決定採用直接路徑方式插入還是常規插入。以便儘量發揮各自的優點,規避相應的缺點。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29827284/viewspace-2136293/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 直接路徑插入 -- insert /*+append*/ into [zt]APP
- 關於直接路徑插入的工作原理
- 關於insert /*+ append*/ 各種insert插入速度比較APP
- oracle常規與直接路徑插入區別Oracle
- 直接路徑插入模式的一些討論模式
- 【Direct-Path】直接路徑載入提升插入效率及其自身限制
- insert /*+ append */ into 與insert into 的區別APP
- Oracle直接路徑載入Oracle
- insert 中append 用法詳解APP
- append插入不能多次未提交插入資料APP
- nologging和insert /*+append*/APP
- Append與Direct-Path Insert(一)APP
- Append與Direct-Path Insert(二)APP
- APPEND,bulk collect,正常插入比較APP
- 臨時表的APPEND方式插入APP
- insert append需要注意的問題APP
- 如何讓insert /*+ append */ 採用並行。APP並行
- 索引對直接路徑載入的影響索引
- [Oracle] Append hint(insert sql) will lead a TM LOCKOracleAPPSQL
- CTAS和insert append的一個測試APP
- insert /*+ append */於report unrecoverable命令實驗。APP
- 關於insert /* append */的幾點註記APP
- insert批量插入優化方案優化
- [CareerCup] 5.1 Insert Bits 插入位
- SQL INSERT批次插入方式SQL
- 直接insert與儲存過程insert效能區別儲存過程
- 【INSERT】在INSERT插入語句中引入條件限制選項實現資料插入控制
- 直接插入排序排序
- 【SQL】 Multi table insert 多表插入操作SQL
- oracle insert all多表插入的示例Oracle
- Direct Path Insert與APPEND, PARALLEL的梳理與小結APPParallel
- insert語句中append提示對欄位的檢查APP
- Word2013支援直接插入播放網路影片
- 直接插入排序法排序
- MySQL INSERT插入條件判斷:如果不存在則插入MySql
- Oracle批量插入資料insert all into用法Oracle
- c++ insert iterators 插入型迭代器C++
- MySQL:使用INSERT 插入多條記錄MySql