undoシリーズ学習の最適なundo_の計算方法义齿retentionの初体験


undo_retentionは、最大データの最小保存時間を簡単に定義します.AUMモードでundo_retentionパラメータは、トランザクションcommit後のundoデータの保持時間に使用されます.秒単位です.これはno guaranteeの制限です.つまり、空間が十分であれば、彼は「花瓶」にすぎない.空き領域が不足し、トランザクションがロールバックする必要がある場合でも、これらのデータは上書きされます.この動作はORA-01555エラーを引き起こす可能性があります.これらのデータが記憶されている時間はv$undostatのフィールドTUNED_を使用することができます.UNDORETENTIONが照会します.
多くの場合、undoデータは上書きされるのではなく、保存されることを望んでいます.では、10 gでoracleはundoにguarantee制御を追加し、すなわち、ユーザはundoテーブル空間がundo_を満たす必要があることを指定することができる.retentionの制限.
alter tablespace undotbs1 retention guarantee|noguarantee;

所望の保持時間を設定してundoテーブル空間属性を変更することで、undoテーブル空間をguaranteeモードで実行できます.次に、noguaranteeとguaranteeの違いを実験で体験します.
sys@ORCL> select tablespace_name,contents,retention from dba_tablespaces where tablespace_name like '%UNDOTBS%';

TABLESPACE_NAME                CONTENTS  RETENTION
------------------------------ --------- -----------
UNDOTBS1                       UNDO      NOGUARANTEE

sys@ORCL> alter system set undo_retention=800;

System altered.

sys@ORCL> alter tablespace undotbs1 retention guarantee;

Tablespace altered.

sys@ORCL> select tablespace_name,contents,retention from dba_tablespaces where tablespace_name like '%UNDOTBS%';

TABLESPACE_NAME                CONTENTS  RETENTION
------------------------------ --------- -----------
UNDOTBS1                       UNDO      GUARANTEE
 undo           
sys@ORCL> select file_name,tablespace_name,bytes/1024/1024 m from dba_data_files where tablespace_name like '%UNDOTBS%';

FILE_NAME                                                                TABLESPACE_NAME                         M
------------------------------------------------------------------------ ------------------------------ ----------
/u01/app/oracle/oradata/ORCL/datafile/o1_mf_undotbs1_8050fkc6_.dbf       UNDOTBS1                               30

sys@ORCL> alter database datafile '/u01/app/oracle/oradata/ORCL/datafile/o1_mf_undotbs1_8050fkc6_.dbf' autoextend off;

Database altered.
           , guarantee   ,     ORA-30036  :
hr@ORCL> select count(*) from t;

  COUNT(*)
----------
   1462140

hr@ORCL> begin
  2        for i in 1..1000
  3       loop
  4         delete from t where rownum<1001;
  5          commit;
  6       end loop;
  7      end;
  7  /
begin
*
ERROR at line 1:
ORA-30036: unable to extend segment by 8 in undo tablespace 'UNDOTBS1'
ORA-06512: at line 4
hr@ORCL> select count(*) from t;

  COUNT(*)
----------
   14620000
     undo   retention   ,        
hr@ORCL> begin
  2        for i in 1..1000 
  3       loop
  4         delete from t where rownum<1001;
  5         commit;
  6       end loop;
  7      end;
  8  /

PL/SQL procedure successfully completed.

    undo_retentionの設定はフラッシュバック機能に責任を負います.カラムのタイプがLOBの場合、自動undoデータの記憶はLOBsをサポートしていません.undo_を設定する必要があります.retentionの値はできるだけ引き留める.oracleはundo segmentヘッダーにretention tableを作成し、関連するundoストレージのコミット時間を記録し、その保存ポリシーを実現します.
最適undo_retentionはどのように計算しますか?
ファジイ計算では、次のことができます.
トランザクション・アイソレーション・レベルがserializableまたはread onlyの場合、undo_retentionは最長実行のトランザクションよりやや長い.トランザクション・アイソレーション・レベルがread commitedの場合、undo_retentionは最長実行文(DML)よりやや長い.
正確な計算は、数式を使用します.
比較的代表的な期間を選択してテストしたり、複数のセグメントを除去したりして、加重平均を設定する必要があります.
 SELECT d.undo_size/(1024*1024) "ACTUAL UNDO SIZE [MByte]",
 SUBSTR(e.value,1,25) "UNDO RETENTION [Sec]",
 ROUND((d.undo_size / (to_number(f.value) *
 g.undo_block_per_sec)))"OPTIMAL UNDO RETENTION [Sec]"
 FROM (
 SELECT SUM(a.bytes) undo_size
 FROM v$datafile a,
 v$tablespace b,
 dba_tablespaces c
 WHERE c.contents = 'UNDO'
 AND c.status = 'ONLINE'
 AND b.name = c.tablespace_name
 AND a.ts# = b.ts#
 ) d,
 v$parameter e,
 v$parameter f,
 (
 SELECT MAX(undoblks/((end_time-begin_time)*3600*24))undo_block_per_sec
 FROM v$undostat
 ) g
 WHERE e.name = 'undo_retention'
 AND f.name = 'db_block_size'
 
 ACTUAL UNDO SIZE [MByte] UNDO RETENTION [Sec]            OPTIMAL UNDO RETENTION [Sec]

                      30    900                                                   40421