Optimasi fungsi undo
Undo merupakan salah satu bagian vital dari oracle database system.Undo berperan dalan menyimpan infomasi dan data-data sebelum perubahan (before image).
Dua hal penting dari manajemen undo adalah sbb:
1. Undo size.
2. Undo retention.
Kedua parameter ini saling berkaitan satu dengan lainnya. Hubungan kedua parameter dapat digambarkan pada perhitungan nilai optimal dari undo retention dan undo size.
* Perhitungan nilai optimal dari undo_retention
Rumus perhitungan undo retention adalah sbb:
optimal undo retention = undo size / (db_block_size * undo_block_per_sec)
Bagaimana mendapatkan nilai undo size?
Hal ini dapat diperoleh dari query sbb:
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#;
Bagaimana mendapatkan nilai undo_block_per_sec?
Hal ini dapat diperoleh dari query sbb:
SELECT MAX(undoblks/((end_time-begin_time)*3600*24))
"UNDO_BLOCK_PER_SEC"
FROM v$undostat;
Bagaimana mendapatkan nilai db_block_size?
Hal ini dapat diperoleh dari query sbb:
SELECT TO_NUMBER(value) "DB_BLOCK_SIZE [KByte]"
FROM v$parameter
WHERE name = 'db_block_size';
Bila semua nilai yang diperlukan untuk menghitung nilai optimal dari undo retention telah didapat dengan menggunakan query-qery diatas, maka nilai optimal dari undo retention dapat dihitung dengan
menggunakan kalkulator atau pun bisa langsung dihitung dengan menggunakan query sbb:
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'
** Perhitungan undo size yang diperlukan
Rumus dari perhitungan undo size adalah sbb:
undo_size = undo_retention * db_block_size * Undo_block_per_sec
Query untuk mendapatkan nilai optimal dari undo size adalah sbb:
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'
Perhatian:
Perhitungan nilai optimal undo retention dan undo size diatas bukanlah perhitungan EXACT, yang harus tepat. Perhitungan diatas hanyalah untuk memperkirakan apakah nilai undo retention dan undo size database kita telah memadai atau untuk keperluan troubleshoot ORA-1555 (snapshoot too old).
Nilai optimal undo retention diatas dapat dibandingan dengan informasi dari alert log yang menyertai ORA-1555.
Misalnya:
ORA-1555: snapshot too old.
(select....... from.... where... [xxxx second]
Nilai xxxx second inilah waktu aktual yang diperlukan untuk memproses query tersebut (yang berada dalam tanda kurung).
Apa perbedaan antara undo retention dan undo size?
Undo retention adalah salah satu dari initial parameter yang berguna untuk mengatur berapa lama informasi di simpan dalam undo segment.
Undo size adalah ukuran dari undo segment atau undo tablespace.