Нашёл здесь полезную мне информацию о том, как можно попробовать подобрать оптимальное значение "undo_retention
" и/или размер табличного пространства "undo
". С удовольствием делюсь:
Необходимое оптимальное значение "undo_retention
" вычисляется по формуле:
Optimal Undo Retention = Actual Undo Size / (DB_BLOCK_SIZE × UNDO_BLOCK_REP_ESC)
Получить это значение можно выполнив следующий запрос (внимание на "OPTIMAL UNDO RETENTION [Sec]")
:
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' ;
Необходимый размер UNDO-tablespace вычисляется по формуле:
Undo Size = Optimal Undo Retention × DB_BLOCK_SIZE × UNDO_BLOCK_REP_ESC
Получить его можно запросом (внимание на "NEEDED UNDO SIZE [MByte]")
:
SELECT d.undo_size/(1024*1024) "ACTUAL UNDO SIZE [MByte]" , SUBSTR(e.value,1,25) "UNDO RETENTION [Sec]" , (TO_NUMBER(e.value) * TO_NUMBER(f.value) * g.undo_block_per_sec) / (1024*1024) "NEEDED UNDO SIZE [MByte]" 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' ;