相同更改資料量的前提下,單次COMMIT和多次COMMIT對日誌空間浪費的影響對比,commit日誌
LGWR進程按照順序寫線上日誌,中間不會跳躍,而且LGWR進程不會在同一個日誌快寫2次,即使一次寫入的日誌快只佔幾個位元組,下次不會再用了,這就造成日誌空間的浪費。Oracle做一次Commit,就會觸發LGWR進程進行日誌緩衝到記錄檔的寫入操作,因此可以說更改相同資料量的前提下,如果提交過於頻繁,產生的日誌可能就會越多,即使第一次Commit佔用的日誌塊仍可以儲存下一次需要寫入的日誌緩衝,那麼下一次Commit會再次佔用一個新的日誌塊。
實驗:
1、系統的日誌塊大小是512位元組。
SQL> select max(lebsz) from sys.x$kccle;
MAX(LEBSZ)
----------
512
2、建立兩張相同資料量的表。
SQL> select count(*) from t1;
COUNT(*)
----------
11188
SQL> select count(*) from t2;
COUNT(*)
----------
11188
3、查看刪除t1表前系統的浪費日誌空間量。
SQL> select name, value from v$sysstat where name like '%wastage%';
NAME VALUE
---------------------------------------------------------------- ----------
redo wastage 208060
4、逐條刪除t1表的記錄。
SQL> begin
2 for i in 1 .. 11188 loop
3 delete from t1 where rownum < 2;
4 commit;
5 end loop;
6 end;
7 /
5、再次查看日誌空間浪費量。
SQL> select name, value from v$sysstat where name like '%wastage%';
NAME VALUE
---------------------------------------------------------------- ----------
redo wastage 1118740
SQL> select 1118740-208060 from dual;
1118740-208060
--------------
910680
浪費日誌空間量是910680位元組。
6、查看當前進程的SID。
SQL> select distinct sid from v$mystat;
SID
----------
215
進而查出當前進程消耗的redo量總大小。
SQL> select b.name, a.value from v$sesstat a, v$statname b
2 where a.statistic#=b.statistic#
3 and b.name like '%redo size%'
4 and a.sid=215;
NAME VALUE
-------------------- ----------
redo size 9103304
可知日誌空間浪費比率有10%
SQL> select 910680/9103304 from dual;
910680/9103304
--------------
.100038404
7、接下來選擇一次性刪除t2表記錄,之前記錄下日誌空間浪費大小。
SQL> select name, value from v$sysstat where name like '%wastage%';
NAME VALUE
-------------------- ----------
redo wastage 1130636
SQL> delete from t2;
11188 rows deleted.
SQL> commit;
Commit complete.
8、查看當前日誌空間浪費。
SQL> select name, value from v$sysstat where name like '%wastage%';
NAME VALUE
-------------------- ----------
redo wastage 1132060
9、計算日誌浪費空間比率。
SQL> select 1132060-1130636 from dual;
1132060-1130636
---------------
1424
SQL> select b.name, a.value from v$sesstat a, v$statname b
2 where a.statistic#=b.statistic#
3 and b.name like '%redo size%'
4 and a.sid=215;
NAME VALUE
-------------------- ----------
redo size 13154544
SQL> select 1424/13154544 from dual;
1424/13154544
-------------
.000108252
從結果看,日誌空間浪費比率僅為0.01%。
結論:
1、LGWR進程按照順序將日誌緩衝寫入日誌塊,不會在同一個日誌塊中寫入兩次,就可能造成上一次寫入的最後一個日誌塊會有空間的浪費,但下一次不能再使用,只能再次寫入一個新的日誌塊。
2、相同更改資料量的前提下,多次提交Commit要比一次Commit浪費更多的日誌塊空間。
oracle 大量資料怎分頁更改後commit,避免佔用大量記憶體
寫個塊就可以了 (每一萬條提交一次)
declare
begin
update * set * ;
if rownum%10000=0 then
commit;
end if;
end;
很久以前對oracle資料庫做過幾次更改操作,但沒有執行過commit命令,怎驗證sqlplus工具有沒有執行commit
很簡單的問題啊查表啊select * from 表名;