REDOログに関する検証 その15

< REDOログに関する検証 その15 > ペンネーム つけまい

— 内部構造を理解し
パフォーマンスの向上に役立てる —

前回は、REDOに関する2つのラッチ「REDOアロケーション・ラッチ」と
「REDOコピー・ラッチ」の役割についての解説を行った。

今回は、ラッチ・タイムアウトの検出および、REDOアロケーション・ラッチ、
REDOコピー・ラッチの競合の低減方法などについての解説を行う。

********** ラッチ・タイムアウトの検出 ***********

Oracleは、全てのラッチに対する統計を収集し、それらをV$LATCHに格納してい
る。以下は、REDOに関するラッチ・タイムアウトを検出するためのSQL文である
が、この結果でGETSとMISSESの合計に対するMISSESの比率(MIS_RATE)が1%を
超える様な場合、ラッチの競合がパフォーマンスに影響を及ぼしている可能性
がある。

<SQL文>

Select name,gets,misses,to_char((misses/(gets+misses)) * 100,'990.99') MIS_RATE
From v$latch Where name = 'redo allocation' or name = 'redo copy' ;

<結果>

NAME                                    GETS    MISSES MIS_RATE
---------------------------------- --------- --------- --------
redo allocation                       221671        71     0.03
redo copy                               2662         3     0.11

******* REDOアロケーション・ラッチの競合の低減 ********

REDOアロケーション・ラッチの競合を低減させるには、単一のプロセスがラッ
チを保持する時間を最小限に抑えるようにすべきである。

REDOアロケーション・ラッチでのコピーを減少させることによって、この時間
を低減させることが可能となる。つまり、LOG_SMALL_ENTRY_MAX_SIZEの値を小
さくすることによって、REDOアロケーション・ラッチでコピーされるREDOエン
トリの数を減少させ、REDOアロケーション・ラッチの競合を低減させるのであ
る。

また、余談ではあるが、REDOアロケーション・ラッチはトランザクションが無
くても、3秒毎にシグナルによって起こされ、ラッチを取得していることを頭に
入れておいていただきたい。

********* REDOコピー・ラッチの競合の低減 **********

複数CPU環境の場合、REDOコピー・ラッチの数を増やすことによって、ラッチの
競合を低減させることができる。

REDOコピー・ラッチの数を増やすことによって、REDOエントリのコピーにかか
る負荷を、各REDOコピー・ラッチに分散できるからである。

LOG_SIMULTANEOUS_COPIESの値を上げることにより、REDOコピー・ラッチの数を
増やすことができる。この値は、CPUの2倍まで指定することができる。

もし、REDOコピー・ラッチの数を増やしても競合が低減しないようであれば、
LOG_SMALL_ENTRY_MAX_SIZEの値を増やすことによって、REDOコピー・ラッチに
対する競合を低減できる場合がある。つまり、REDOコピー・ラッチにかかる負
荷をREDOアロケーション・ラッチにも負担させ、REDOコピー・ラッチに対する
負荷を低減させるのである。

しかし、LOG_SMALL_ENTRY_MAX_SIZEの値をあまり大きくしすぎてしまうと、
ショート・ラッチで済んでいたREDOアロケーション・ラッチの時間が長くなり、
タイムアウトを誘発してしまう恐れがあるので、最大でもデフォルトの10倍
(800=Oracle7.2以前のデフォルト)以内にとどめるべきである。

なお、Oracle8.1より、LOG_SMALL_ENTRY_MAX_SIZE及びLOG_SIMULTANEOUS_COPIES
共に、obsolete parameter(一般にはもう使われていないパラメータ)扱いと
なった。

ちなみに、LOG_SIMULTANEOUS_COPIESは、_(アンダースコア)で始まる隠しパ
ラメータとなっている。

次回は、チェックポイントについての解説を行う予定である。

以上 真夏の賑やかさが恋しい茅ヶ崎海岸にて