[20130607]PL/SQL儲存過程的commit提交問題.txt
[20130607]PL/SQL儲存過程的commit提交問題.txt
昨天在看別人寫的儲存過程的時候,發現程式程式碼裡面不好的寫法,就是把commit寫在迴圈體內,這樣寫按照以前應該會產生很大的redo日
志,主要是redo waste也會增加,但是我在11G下測試,情況好像不一樣.
1.建立測試環境:
--對比發現時間上並沒有什麼差別,當然redo size前面幾乎比後面的大1倍,不知道為什麼這個版本redo wastage都是0.
--我記憶裡面以前在8i下做過測試,測試1應該需要許多時間.不可能這麼快完成.
4.測試3
--突然想起來10g下提交可以改成如下:
--Elapsed: 00:01:01.14.redo size=5527876-728=5527148.
5.google找到如下連結:
--我修改一點,加入commit的比較.
--很明顯commit與COMMIT WRITE WAIT一致.
昨天在看別人寫的儲存過程的時候,發現程式程式碼裡面不好的寫法,就是把commit寫在迴圈體內,這樣寫按照以前應該會產生很大的redo日
志,主要是redo waste也會增加,但是我在11G下測試,情況好像不一樣.
1.建立測試環境:
SQL> @ver
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
create table t (a number,b varchar2(10));
$ cat viewredo.sql
SELECT b.NAME, a.statistic#, a.VALUE
FROM v$mystat a, v$statname b
WHERE b.NAME IN ('redo size', 'redo wastage') AND a.statistic# = b.statistic#;
2.測試1:(commit在迴圈體內)
set timing on
@viewredo.sql
begin
for i in 1..10000 loop
insert into t values (i,'test');
commit;
end loop;
end;
/
@viewredo
@viewredo.sql
NAME STATISTIC# VALUE
-------------------- ---------- ----------
user commits 6 0
redo size 178 728
redo wastage 183 0
@viewredo.sql
NAME STATISTIC# VALUE
-------------------- ---------- ----------
user commits 6 10000
redo size 178 4863032
redo wastage 183 0
--Elapsed: 00:00:01.32,redo size=4863032-728=4862304.
3.測試2:(commit在迴圈體外)
set timing on
@viewredo.sql
begin
for i in 1..10000 loop
insert into t values (i,'test');
end loop;
commit;
end;
/
@viewredo.sql
NAME STATISTIC# VALUE
-------------------- ---------- ----------
user commits 6 0
redo size 178 728
redo wastage 183 0
NAME STATISTIC# VALUE
-------------------- ---------- ----------
user commits 6 1
redo size 178 2536896
redo wastage 183 0
--Elapsed: 00:00:00.56,redo size=2536896-728=2536168.
--對比發現時間上並沒有什麼差別,當然redo size前面幾乎比後面的大1倍,不知道為什麼這個版本redo wastage都是0.
--我記憶裡面以前在8i下做過測試,測試1應該需要許多時間.不可能這麼快完成.
4.測試3
--突然想起來10g下提交可以改成如下:
set timing on
@viewredo.sql
begin
for i in 1..10000 loop
insert into t values (i,'test');
commit write wait;
end loop;
end;
/
@viewredo.sql
NAME STATISTIC# VALUE
-------------------- ---------- ----------
user commits 6 0
redo size 178 728
redo wastage 183 0
NAME STATISTIC# VALUE
-------------------- ---------- ----------
user commits 6 10000
redo size 178 5527876
redo wastage 183 0
--Elapsed: 00:01:01.14.redo size=5527876-728=5527148.
5.google找到如下連結:
--我修改一點,加入commit的比較.
CREATE TABLE commit_test (
id NUMBER(10),
description VARCHAR2(50),
CONSTRAINT commit_test_pk PRIMARY KEY (id)
);
SET SERVEROUTPUT ON
DECLARE
PROCEDURE do_loop (p_type IN VARCHAR2) AS
l_start NUMBER;
l_loops NUMBER := 1000;
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE commit_test';
l_start := DBMS_UTILITY.get_time;
FOR i IN 1 .. l_loops LOOP
INSERT INTO commit_test (id, description)
VALUES (i, 'Description for ' || i);
CASE p_type
WHEN 'WAIT' THEN COMMIT WRITE WAIT;
WHEN 'NOWAIT' THEN COMMIT WRITE NOWAIT;
WHEN 'BATCH' THEN COMMIT WRITE BATCH;
WHEN 'IMMEDIATE' THEN COMMIT WRITE IMMEDIATE;
WHEN 'BATCH,WAIT' THEN COMMIT WRITE BATCH WAIT;
WHEN 'BATCH,NOWAIT' THEN COMMIT WRITE BATCH NOWAIT;
WHEN 'IMMEDIATE,WAIT' THEN COMMIT WRITE IMMEDIATE WAIT;
WHEN 'IMMEDIATE,NOWAIT' THEN COMMIT WRITE IMMEDIATE NOWAIT;
else COMMIT;
END CASE;
END LOOP;
DBMS_OUTPUT.put_line(RPAD('COMMIT WRITE ' || p_type, 30) || ': ' || (DBMS_UTILITY.get_time - l_start));
END;
BEGIN
do_loop('other');
do_loop('WAIT');
do_loop('NOWAIT');
do_loop('BATCH');
do_loop('IMMEDIATE');
do_loop('BATCH,WAIT');
do_loop('BATCH,NOWAIT');
do_loop('IMMEDIATE,WAIT');
do_loop('IMMEDIATE,NOWAIT');
END;
/
COMMIT WRITE other : 18
COMMIT WRITE WAIT : 680
COMMIT WRITE NOWAIT : 18
COMMIT WRITE BATCH : 780
COMMIT WRITE IMMEDIATE : 752
COMMIT WRITE BATCH,WAIT : 901
COMMIT WRITE BATCH,NOWAIT : 19
COMMIT WRITE IMMEDIATE,WAIT : 991
COMMIT WRITE IMMEDIATE,NOWAIT : 16
PL/SQL procedure successfully completed.
--很明顯commit與COMMIT WRITE WAIT一致.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-763439/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PL/SQL中動態掉用儲存過程SQL儲存過程
- 使用儲存過程(PL/SQL)向資料庫中儲存BLOB物件儲存過程SQL資料庫物件
- SQL 儲存過程裡呼叫另一個儲存過程SQL儲存過程
- mysql多次呼叫儲存過程的問題MySql儲存過程
- SQL 分頁儲存過程SQL儲存過程
- MySQL儲存過程的許可權問題MySql儲存過程
- ORACLE PL/SQL 物件、表資料對比功能儲存過程簡單實現OracleSQL物件儲存過程
- SQL Server 資料訪問策略:儲存過程QCSQLServer儲存過程
- 達夢儲存過程效能問題定位儲存過程
- Sql儲存過程分頁--臨時表儲存SQL儲存過程
- SQL server儲存過程函式SQLServer儲存過程函式
- SQL Server儲存過程的優缺點SQLServer儲存過程
- [20211229]sql語句包含中文儲存clob的編碼問題.txtSQL
- 儲存過程訪問其他使用者的表的問題儲存過程
- [20180502]PLDEVELOP與儲存過程除錯.txtdev儲存過程除錯
- SQL SERVER儲存過程AS和GO的含義SQLServer儲存過程Go
- 【SQL Server】常見系統儲存過程SQLServer儲存過程
- SQL Server 2005的複製儲存過程選項BYSQLServer儲存過程
- MySQL儲存過程裡動態SQL的使用UXMySql儲存過程UX
- oracle的儲存過程Oracle儲存過程
- pl/sql developer的一個小問題SQLDeveloper
- EF中使用SQL語句或儲存過程SQL儲存過程
- Ms Sql Server查詢儲存過程中的內容SQLServer儲存過程
- Oracle儲存過程乾貨(一):儲存過程基礎Oracle儲存過程
- SQL Server實戰六:T-SQL、遊標、儲存過程的操作SQLServer儲存過程
- 儲存過程與儲存函式儲存過程儲存函式
- unidac儲存過程儲存過程
- firedac儲存過程儲存過程
- 呼叫儲存過程儲存過程
- mysql 儲存過程MySql儲存過程
- SQLSERVER儲存過程SQLServer儲存過程
- Oracle儲存過程Oracle儲存過程
- Mysql 儲存過程的使用MySql儲存過程
- Sqlserver中的儲存過程SQLServer儲存過程
- [20240607]PL/SQL中sql語句的註解.txtSQL
- mysql無法建立儲存過程問題 ERROR 1307 (HY000)MySql儲存過程Error
- [20190118]toad下如何除錯儲存過程和函式.txt除錯儲存過程函式
- mssql 儲存過程呼叫另一個儲存過程中的結果的方法分享SQL儲存過程
- SQL Server實戰五:儲存過程與觸發器SQLServer儲存過程觸發器