APPEND,bulk collect,正常插入比較
在最佳化某個庫歸檔過多專案時,我建議開發人員用bulk collect,代替正常的批次插入
最後在檢查他們最佳化的時候,發現他們使用append代替我建議的bulk collect,,同樣也達到了目的。
針對他們之間的產生歸檔量的效果,我做了簡單的測試。
SQL> create table david_forall tablespace users as select * from dba_objects;
Table created.
SQL> create table david_forall2 tablespace users as select * from dba_objects where rownum=0;
Table created.
SQL> select count(*) from david_forall;
COUNT(*)
----------
89880
SQL> select count(*) from david_forall2;
COUNT(*)
----------
0
SQL> set timing on;
SQL> select st.name,ss.value from v$mystat ss, v$statname st
2 where ss.statistic# = st.statistic#
3 and st.name in ('redo size','undo change vector size','CPU used by this session');
NAME VALUE
---------------------------------------------------------------- ----------
CPU used by this session 150
redo size 10851424
undo change vector size 26288
Elapsed: 00:00:00.02
SQL> begin
2
3 insert /*+ append */ into david_forall2 select * from maclean_forall;
4 commit;
5
6 end;
7 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.21
SQL> select st.name,ss.value from v$mystat ss, v$statname st
2 where ss.statistic# = st.statistic#
3 and st.name in ('redo size','undo change vector size','CPU used by this session');
NAME VALUE
---------------------------------------------------------------- ----------
CPU used by this session 168
redo size 21653724
undo change vector size 38236
Elapsed: 00:00:00.01
SQL> declare
2 type recstartyp is table of david_forall%rowtype index by BINARY_INTEGER;
3 rec_tab recstartyp;
4 cursor temp is select * from david_forall;
5 begin
6 open temp;
7 fetch temp bulk collect into rec_tab;
8 FORALL i in rec_tab.first..rec_tab.last
9 insert into david_forall2 values rec_tab(i);
10 commit;
11 close temp;
12 end;
13 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:01.15
SQL> select st.name,ss.value from v$mystat ss, v$statname st
2 where ss.statistic# = st.statistic#
3 and st.name in ('redo size','undo change vector size','CPU used by this session');
NAME VALUE
---------------------------------------------------------------- ----------
CPU used by this session 272
redo size 32286160
undo change vector size 383664
Elapsed: 00:00:00.00
SQL> declare
2
3 cursor temp is select * from david_forall;
4 begin
5
6 for i in temp loop
7 insert into david_forall2 values i;
8 end loop;
9 commit;
10 end;
11 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:06.93
SQL> select st.name,ss.value from v$mystat ss, v$statname st
2 where ss.statistic# = st.statistic#
3 and st.name in ('redo size','undo change vector size','CPU used by this session');
NAME VALUE
---------------------------------------------------------------- ----------
CPU used by this session 945
redo size 66555352
undo change vector size 6490104
Elapsed: 00:00:00.00
SQL> select 10851424,21653724-10851424,32286160-21653724,66555352-32286160 from dual;
10851424 21653724-10851424 32286160-21653724 66555352-32286160
---------- ----------------- ----------------- -----------------
10851424 10802300 10632436 34269192
Elapsed: 00:00:00.00
可以看出/*+ APPEND */和bulk collect所產生的日誌量是差不多的
/*+ APPEND */ redo 10802300
bulk collect redo 10632436
正常插入 redo 34269192
為此,我們需要訪問兩個動態效能檢視:
V$MYSTAT,其中有會話的提交資訊。
V$STATNAME,這個檢視能告訴我們 V$MYSTAT 中的每一行表示什麼(所檢視的統計名)。
生成的 redo 越多,操作花費的時間就越長,整個系統也會越慢。你不光在影響你自己的會話,還會影響每一個會話。redo管理是資料庫中的一個序列點。任何 Oracle 例項都只有一個 LGWR,最終所有事務都會歸於 LGWR,要求這個程式管理它們的 redo,
最後在檢查他們最佳化的時候,發現他們使用append代替我建議的bulk collect,,同樣也達到了目的。
針對他們之間的產生歸檔量的效果,我做了簡單的測試。
SQL> create table david_forall tablespace users as select * from dba_objects;
Table created.
SQL> create table david_forall2 tablespace users as select * from dba_objects where rownum=0;
Table created.
SQL> select count(*) from david_forall;
COUNT(*)
----------
89880
SQL> select count(*) from david_forall2;
COUNT(*)
----------
0
SQL> set timing on;
SQL> select st.name,ss.value from v$mystat ss, v$statname st
2 where ss.statistic# = st.statistic#
3 and st.name in ('redo size','undo change vector size','CPU used by this session');
NAME VALUE
---------------------------------------------------------------- ----------
CPU used by this session 150
redo size 10851424
undo change vector size 26288
Elapsed: 00:00:00.02
SQL> begin
2
3 insert /*+ append */ into david_forall2 select * from maclean_forall;
4 commit;
5
6 end;
7 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.21
SQL> select st.name,ss.value from v$mystat ss, v$statname st
2 where ss.statistic# = st.statistic#
3 and st.name in ('redo size','undo change vector size','CPU used by this session');
NAME VALUE
---------------------------------------------------------------- ----------
CPU used by this session 168
redo size 21653724
undo change vector size 38236
Elapsed: 00:00:00.01
SQL> declare
2 type recstartyp is table of david_forall%rowtype index by BINARY_INTEGER;
3 rec_tab recstartyp;
4 cursor temp is select * from david_forall;
5 begin
6 open temp;
7 fetch temp bulk collect into rec_tab;
8 FORALL i in rec_tab.first..rec_tab.last
9 insert into david_forall2 values rec_tab(i);
10 commit;
11 close temp;
12 end;
13 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:01.15
SQL> select st.name,ss.value from v$mystat ss, v$statname st
2 where ss.statistic# = st.statistic#
3 and st.name in ('redo size','undo change vector size','CPU used by this session');
NAME VALUE
---------------------------------------------------------------- ----------
CPU used by this session 272
redo size 32286160
undo change vector size 383664
Elapsed: 00:00:00.00
SQL> declare
2
3 cursor temp is select * from david_forall;
4 begin
5
6 for i in temp loop
7 insert into david_forall2 values i;
8 end loop;
9 commit;
10 end;
11 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:06.93
SQL> select st.name,ss.value from v$mystat ss, v$statname st
2 where ss.statistic# = st.statistic#
3 and st.name in ('redo size','undo change vector size','CPU used by this session');
NAME VALUE
---------------------------------------------------------------- ----------
CPU used by this session 945
redo size 66555352
undo change vector size 6490104
Elapsed: 00:00:00.00
SQL> select 10851424,21653724-10851424,32286160-21653724,66555352-32286160 from dual;
10851424 21653724-10851424 32286160-21653724 66555352-32286160
---------- ----------------- ----------------- -----------------
10851424 10802300 10632436 34269192
Elapsed: 00:00:00.00
可以看出/*+ APPEND */和bulk collect所產生的日誌量是差不多的
/*+ APPEND */ redo 10802300
bulk collect redo 10632436
正常插入 redo 34269192
為此,我們需要訪問兩個動態效能檢視:
V$MYSTAT,其中有會話的提交資訊。
V$STATNAME,這個檢視能告訴我們 V$MYSTAT 中的每一行表示什麼(所檢視的統計名)。
生成的 redo 越多,操作花費的時間就越長,整個系統也會越慢。你不光在影響你自己的會話,還會影響每一個會話。redo管理是資料庫中的一個序列點。任何 Oracle 例項都只有一個 LGWR,最終所有事務都會歸於 LGWR,要求這個程式管理它們的 redo,
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29033984/viewspace-768378/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 的 bulk collect用法Oracle
- 關於insert /*+ append*/ 各種insert插入速度比較APP
- 【PL/SQL】初試 bulk collectSQL
- 通過append hint來插入資料,演示它和普通插入資料的效能比較。APP
- BULK COLLECT FAILS WITH ORA-04030AI
- pl/sql中bulk collect的用法SQL
- 使用BULK COLLECT+FORALL加速批量提交
- 使用Bulk Collect提高Oracle查詢效率Oracle
- PL/SQL LOB和檔案操作,bulk collectSQL
- 使用bulk collect實現cursor 批量fetch!
- 多行資料的批處理之bulk collect
- 用BULK COLLECT 減小LOOP的開銷(1)OOP
- Oracle中巧用bulk collect實現cursor批次fetchOracle
- [20180110]Oracle Bulk Collect and LimitOracleMIT
- 使用oracle bulk collect 提高select FETCH LOOP的速度OracleOOP
- oracle中bulk collect into用法 (批次效率提取遊標資料)Oracle
- 使用Forall 與bulk collect的快速複製表資料
- 【MyBatis】幾種批量插入效率的比較MyBatis
- append插入不能多次未提交插入資料APP
- 遊標+bulk collect into limit的不同方法查詢資料MIT
- oracle10g_plsql_rercursor_type_table of_小引例_bulk collect intoOracleSQL
- [20180111]Oracle Bulk Collect and Limit2OracleMIT
- Oracle資料庫的BULK COLLECT用法之批量增刪改<轉>Oracle資料庫
- insert /*+ append */直接路徑插入APP
- 臨時表的APPEND方式插入APP
- 一次遷移思考的記錄--bulk_collect的limit用法MIT
- 直接路徑插入 -- insert /*+append*/ into [zt]APP
- 大資料量下MySQL插入方法的效能比較大資料MySql
- 二叉樹的建立,插入,查詢,清空和比較二叉樹
- MySQL大量資料插入各種方法效能分析與比較MySql
- Dapper, Ef core, Freesql 插入大量資料效能比較(二)APPSQL
- 轉摘plsql高階程式設計_table_array_for all_bulk collect into_fetchSQL程式設計
- bulk_collect結合dbms_application_info監控資料處理進度APP
- js 深比較和淺比較JS
- 驗證append插入資料的額外收穫APP
- Python解惑:整數比較 is ==的比較Python
- 字串比較字串
- Oracle date 型別比較和String比較Oracle型別