Terug naar de beginpaginaCentor Homepage
TIPS & TRUCS

Redo Log Buffer Latches - Stephen Rea

Wanneer een transactie zijn wijzigingen naar de Redo Log wil schrijven, moet hij eerst de Redo Allocation Latch alloceren. Daar is er slechts één van om te voorkomen dat anderen er tegelijkertijd in schrijven. Als iemand anders de Latch heeft gelocked, moet het huidige proces dus wachten.

Zodra de Latch is gealloceerd en de wijziging is groter dan log_small_entry_max_size bytes en de server heeft meerdere CPU's, dan probeert het proces een Redo Copy Latch te alloceren (waarvan er maximaal tweemaal het aantal CPU's aanwezig kunnen zijn) waardoor de Redo Allocation Latch kan worden vrijgegeven voor een ander proces.
Als er geen beschikbaar is, zal het proces niet op een Redo Copy Latch wachten, maar zal het de Redo Allocation Latch vasthouden tot het proces is beëindigd.

Oracle houdt statistieken bij voor deze Latches in v$latch, inclusief het aantal gets en missers voor de Redo Allocation Latch en het aantal gets en missers voor de Redo Copy Latch (de cumulatieven hiervan sinds de instance startup).
Indien je een hit ratio hebt van 100% voor één van beiden, is dat goed. Dat betekent dat al je processen in staat zijn geweest in éénmaal een Latch te alloceren.
Zodra de hit ratio regelmatig onder de 99% komt, moet je oppassen.

Zo bereken je de huidige hit ratio voor de Latches:

COLUMN latch_name FORMAT a20
SELECT name latch_name
, gets
, misses
, round(decode(gets-misses,0,1,gets-misses)
___________/
___________decode(gets,0,1,gets)
,3) hit_ratio
FROM v$latch
WHERE name = 'redo allocation';
COLUMN latch_name FORMAT a20
SELECT name latch_name
, immediate_gets
, immediate_misses
, round(decode(immediate_gets-immediate_misses,0,1,
immediate_gets-immediate_misses)
/
decode(immediate_gets,0,1,immediate_gets)
,3) hit_ratio
FROM v$latch WHERE name = _'redo copy'_;

Indien de Redo Allocation Latch regelmatig onder de 99% komt en je hebt meerdere CPU's, kun je de waarde voor log_small_entry_max_size verlagen (zie onder) in de init.ora. Dat wil zeggen dat elke wijziging kleiner dan log_small_entry_max_size de Redo Allocation Log zal vasthouden totdat de wijziging is verwerkt.
Elke wijziging groter dan dat zal - indien beschikbaar - een Redo Copy Latch gebruiken en zal de Redo Allocation Log vrijgeven voor een ander proces.

Indien de Redo Copy Latch regelmatig onder de 99% komt en je hebt meerdere CPU_s, kun je de waarde van log_simultaneous_copies in de init.ora ophogen tot maximaal tweemaal het aantal CPU_s, om op die manier meer Redo Copy Latches te creëren.

Uiteraard moet je de database instance opnieuw opstarten om deze parameters effectief te laten worden. De init.ora vind je in $oracle_home/dbs/initSID.ora.

De huidige waarden voor deze parameters vind je als volgt:

COLUMN name FORMAT a30
COLUMN value FORMAT a10
SELECT name
, value
FROM v$parameter
WHERE name IN
('log_small_entry_max_size'

,'log_simultaneous_copies'
,'cpu_count');