相同更改資料量的前提下,單次COMMIT和多次COMMIT對日誌空間浪費的影響對比,commit日誌

來源:互聯網
上載者:User

相同更改資料量的前提下,單次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 表名;
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.