oracle 儲存過程批次提交
1.
create table t_ref as select * from all_objects;
insert into t_ref select * from t;
insert into t_ref select * from t;
insert into t_ref select * from t;
insert into t_ref select * from t;
insert into t_ref select * from t;
2.模擬逐行提交的情況,注意觀察執行時間
目標是將t_ref表中的資料全部插入到t中
set timing on
DECLARE
BEGIN
FOR cur IN (SELECT * FROM t_ref) LOOP
INSERT INTO t VALUES cur;
COMMIT;
END LOOP;
END;
/
3分
3.模擬批次提交
truncate table t;
DECLARE
v_count NUMBER;
BEGIN
FOR cur IN (SELECT * FROM t_ref) LOOP
INSERT INTO t VALUES cur;
v_count := v_count + 1;
IF v_count >= 100 THEN
COMMIT;
v_count:=0;
END IF;
END LOOP;
COMMIT;
END;
/
1分多,大約是逐行提交方法一半的時間
4.更高階的方法,體驗一下極限速度。
DECLARE
CURSOR cur IS
SELECT * FROM t_ref;
TYPE rec IS TABLE OF t_ref%ROWTYPE;
recs rec;
BEGIN
OPEN cur;
WHILE (TRUE) LOOP
FETCH cur BULK COLLECT
INTO recs LIMIT 100;
FORALL i IN 1 .. recs.COUNT
INSERT INTO t VALUES recs (i);
COMMIT;
EXIT WHEN cur%NOTFOUND;
END LOOP;
CLOSE cur;
END;
/
DECLARE
v_count NUMBER;
BEGIN
FOR cur IN ( select * from gsinfo.t_order_backup where query_info='MonitorAdd' and substr(order_no ,21,22) in (1,5) ) LOOP
update gsinfo.t_order_backup set state='1' where query_info=cur.query_info and order_no=cur.order_no;
v_count := v_count + 1;
IF v_count >= 100 THEN
COMMIT;
END IF;
END LOOP;
COMMIT;
END;
/
頻繁的COMMIT會引起大量Redo Log的物理I/O,會極大的限制資料庫的效能
因此,為提高資料庫效能,儘可能的批次提交。
Oracle有很多優秀的方法值得嘗試
create table t_ref as select * from all_objects;
insert into t_ref select * from t;
insert into t_ref select * from t;
insert into t_ref select * from t;
insert into t_ref select * from t;
insert into t_ref select * from t;
2.模擬逐行提交的情況,注意觀察執行時間
目標是將t_ref表中的資料全部插入到t中
set timing on
DECLARE
BEGIN
FOR cur IN (SELECT * FROM t_ref) LOOP
INSERT INTO t VALUES cur;
COMMIT;
END LOOP;
END;
/
3分
3.模擬批次提交
truncate table t;
DECLARE
v_count NUMBER;
BEGIN
FOR cur IN (SELECT * FROM t_ref) LOOP
INSERT INTO t VALUES cur;
v_count := v_count + 1;
IF v_count >= 100 THEN
COMMIT;
v_count:=0;
END IF;
END LOOP;
COMMIT;
END;
/
1分多,大約是逐行提交方法一半的時間
4.更高階的方法,體驗一下極限速度。
DECLARE
CURSOR cur IS
SELECT * FROM t_ref;
TYPE rec IS TABLE OF t_ref%ROWTYPE;
recs rec;
BEGIN
OPEN cur;
WHILE (TRUE) LOOP
FETCH cur BULK COLLECT
INTO recs LIMIT 100;
FORALL i IN 1 .. recs.COUNT
INSERT INTO t VALUES recs (i);
COMMIT;
EXIT WHEN cur%NOTFOUND;
END LOOP;
CLOSE cur;
END;
/
DECLARE
v_count NUMBER;
BEGIN
FOR cur IN ( select * from gsinfo.t_order_backup where query_info='MonitorAdd' and substr(order_no ,21,22) in (1,5) ) LOOP
update gsinfo.t_order_backup set state='1' where query_info=cur.query_info and order_no=cur.order_no;
v_count := v_count + 1;
IF v_count >= 100 THEN
COMMIT;
END IF;
END LOOP;
COMMIT;
END;
/
頻繁的COMMIT會引起大量Redo Log的物理I/O,會極大的限制資料庫的效能
因此,為提高資料庫效能,儘可能的批次提交。
Oracle有很多優秀的方法值得嘗試
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30345407/viewspace-2126548/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle儲存過程Oracle儲存過程
- oracle的儲存過程Oracle儲存過程
- Oracle儲存過程-1Oracle儲存過程
- Oracle儲存過程乾貨(一):儲存過程基礎Oracle儲存過程
- mysql 儲存過程 procedure 批次建表MySql儲存過程
- 原創:oracle 儲存過程Oracle儲存過程
- oracle儲存過程書寫格式Oracle儲存過程
- Sqlsugar呼叫Oracle的儲存過程SqlSugarOracle儲存過程
- LightDB/PostgreSQL 相容Oracle儲存過程SQLOracle儲存過程
- oracle儲存過程和觸發器Oracle儲存過程觸發器
- Oracle 儲存過程分頁 + Sqlsugar呼叫Oracle儲存過程SqlSugar
- ibatis呼叫oracle儲存過程(極簡版)BATOracle儲存過程
- Springboot呼叫Oracle儲存過程的幾種方式Spring BootOracle儲存過程
- Oracle 編譯儲存過程卡死解決方法Oracle編譯儲存過程
- SQL 儲存過程裡呼叫另一個儲存過程SQL儲存過程
- 儲存過程與儲存函式儲存過程儲存函式
- SQLSERVER儲存過程SQLServer儲存過程
- 呼叫儲存過程儲存過程
- mysql 儲存過程MySql儲存過程
- unidac儲存過程儲存過程
- firedac儲存過程儲存過程
- Oracle儲存過程中定義多個遊標Oracle儲存過程
- Oracle儲存過程中跳出迴圈的寫法Oracle儲存過程
- Oracle儲存過程乾貨(二):PLSQL控制語句Oracle儲存過程SQL
- Oracle儲存過程編譯卡死的解決方法Oracle儲存過程編譯
- oracle儲存過程許可權繼承小結Oracle儲存過程繼承
- JdbcTemplate調儲存過程JDBC儲存過程
- 造數儲存過程儲存過程
- 儲存過程——遊標儲存過程
- 儲存過程 傳 datatable儲存過程
- JAVA儲存過程(轉)Java儲存過程
- MySQL之儲存過程MySql儲存過程
- MySQL---------儲存過程MySql儲存過程
- linux呼叫儲存過程Linux儲存過程
- Winform呼叫儲存過程ORM儲存過程
- mysql儲存過程整理MySql儲存過程
- Oracle儲存過程乾貨(三):PLSQL迴圈語句Oracle儲存過程SQL
- lightdb新特性--相容oracle儲存過程的聯合陣列Oracle儲存過程陣列
- .NET Core中使用Dapper操作Oracle儲存過程最佳實踐APPOracle儲存過程