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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 通過append hint來插入資料,演示它和普通插入資料的效能比較。APP
- 【MyBatis】幾種批量插入效率的比較MyBatis
- Dapper, Ef core, Freesql 插入大量資料效能比較(二)APPSQL
- js 深比較和淺比較JS
- 7.53 COLLECT
- Oracle date 型別比較和String比較Oracle型別
- 字串比較字串
- Integer比較
- 比較集合
- 效能比較
- Go和Python比較的話,哪個比較好?GoPython
- 比較檔案是否相同,(比較MD5值)
- [C++] 自定義C++比較器比較大小C++
- 批量插入 1 萬條資料,DB 查詢構造器和原生 SQL 效能比較SQL
- 數字比較
- PHP比較字串PHP字串
- 常用 NoSQL 比較SQL
- 列舉比較
- Jsonunit 比較jsondiffJSON
- easyExcel & poi 比較Excel
- Integer的比較
- CORS/JSONP比較CORSJSON
- ==與equals比較
- 主流CRM比較
- Java 比較器Java
- python append()PythonAPP
- URLSearchParams append()APP
- TCP和UDP比較TCPUDP
- Hibernate與mybatis比較MyBatis
- forEach、map、reduce比較
- VUE中diff比較Vue
- yarn 與 npm 比較YarnNPM
- java比較日期大小Java
- Vue與React比較VueReact
- 併發模型比較模型
- 有序佇列比較佇列
- Redis 和 Memcached 比較Redis
- Java和JavaSciprt比較Java
- SCSS 比較運算子CSS