パフォチュー日記&QA3

~読者からの「質mon」に関する検証~

<読者からの質問 その1>

システムのアクティビティを調査したいと思います。テーブル単位でどれだけ
データの変更があったか知る方法はないでしょうか?

<きっちんイーター>

Oracle8.1からの新機能でテーブルを指定して監視や統計情報を見る事ができる
方法があります。テーブルに対し、MONITORING キーワードを設定します。
MONITORINGは、以下のようなコマンドで使用する。
これは、その表に対して何行のDML処理があったかをMONITORINGする機能である。
その結果は、USER_TAB_MODIFICATIONS に格納される。

SQL> create table AA as select * from emp;
SQL> alter table AA monitoring;

あるいは、

SQL> create table AA monitoring as select * from emp;

設定を確認してみよう。

SQL> select table_name, monitoring from user_tables 
     where table_name = 'AA';

TABLE_NAME                     MON
------------------------------ ---
AA                             YES

インサートしてもすぐには値は、USER_TAB_MODIFICATIONS に反映されない。

SQL> select * from user_tab_modifications where table_name = 'AA';
レコードが選択されませんでした。
SQL> insert into AA select * from emp;
12行が作成されました。
SQL> select * from user_tab_modifications where table_name = 'AA';
レコードが選択されませんでした。
SQL> commit;
コミットが完了しました。
SQL> select * from user_tab_modifications where table_name = 'AA';
レコードが選択されませんでした。

オラクルを再起動すると、12行データがインサートされた様子が
USER_TAB_MODIFICATIONS の INSERTS からわかる。USER_TAB_MODIFICATIONS に
データが反映されるのは、再起動か、数時間毎の様である。(詳細は今後の検証
課題とさせてください。)

SQL> select table_name,inserts,updates,deletes,
            to_char(timestamp,'YY/MM/DD HH24:MI:SS') timestamp 
     from user_tab_modifications
where table_name = 'AA'

TABLE_NAME                   INSERTS   UPDATES   DELETES TIMESTAMP
-------------------------- --------- --------- --------- -----------------
AA                                12         0         0 02/02/27 15:51:40

MONITORING の指定を外すには NOMONITORING を指定する必要があります。

SQL> alter table AA nomonitoring;
SQL> select table_name, monitoring from user_tables 
     where table_name = 'AA';

TABLE_NAME                     MON
------------------------------ ---
AA                             NO

┏─━─━─━─━─━─━─━─━─━─━─━─━─━─━─━─━┓
●【 パフォチュー・コンサル日記 】 ●
┗─━─━─━─━─━─━─━─━─━─━─━─━─━─━─━─━┛
第3回 ディスク装置の認識

パフォチュー・コンサル日記に、あまりに多くの反響があったことに驚いてい
ます。RAIDディスクに関して、今回は質問コーナーから始めたいと思います。

<読者からの質問>
前回のホットスペアの意味はディスク交換だけではないのでは?

<前回の記事>
ホットスペアの意味は?
RAID5では1本のディスク・ドライブがクラッシュしてもパリティ情報からデー
タを失うことなく運用を続ける事ができます。しかし、ディスク交換時にはシ
ステムを止めなければなりません。ホットスペア・ディスクがあればクラッシ
ュ後のディスク交換時にもシステム停止を回避することができます。

少し補足します。
ホットスペアが無くても装置によっては電源断をせずにディスク交換する事が
可能です。そのような装置でもホットスペアを使用する場合の目的は、クラッ
シュしたディスクを交換するまで時間(日数)がかかり「これ以上クラッシュ
したらデータが無くなる!」なんていうシチュエーションを防ぐため!鉄壁な
データ保障を行うため!
です。

それでは、本題に入りましょう!

RAIDを構成するディスク・ドライブの「実装本数」と同様に押さえておかなけ
ればならない項目に「ストライピング・ファクタ」があります。ストライピン
グ・ファクタというと分かりづらいので「ストライピング・サイズ」と呼ぶ事
もあります。

ストライピング・サイズはいくつですか?
大抵のお客様はこの質問に困惑されます。なぜならばハードウェアのセットア
ップやOSのインストールは全てメーカに一任されているからです。かく言う私
たちもそれらの作業はお任せする場合がほとんどです。ただ、「RAIDディスク
はOracleデータベースを入れますのでストライピング・サイズは32KBでお願い
します!」とかの指示だけは必ずします。

ストライピング・サイズ4KBのRAID5を3本で構成?
ストライピング・サイズが小さくディスク・ドライブの実装本数が少ないと1回
の書き込みI/Oが同一ディスクに舞い戻って書き込みが行われたりします。スト
ライピング度が相当高くないのであれば、すなわちRAIDを構成するディスク・ド
ライブ数がそれほど多くないのであれば、4KBは小さすぎる値です。

少し難しい説明を追加しなければ反論を受けてしまうかもしれないので、、、
OracleのディスクI/O処理単位はOracleブロック単位です。Oracleブロックの大
きさはシステムの傾向により指定する事ができるのですが、同時ユーザ数の多
いOLTP系の処理では4KBは一般的なサイズです。同時実行数の多いシステムを構
築しなければいけない場合にI/O待ちを防ぐ目的で複数ディスク・ドライブによ
るI/Oストライピングを行います。
ディスクへの書き込み処理と読み込み処理を区別してI/Oストライピングの効果
を考えてみましょう(前提条件は同時ユーザ数が多いのでRAIDディスクを採択
しているというサイトでの考察です)。

Oracleの書き込み処理はDBWRが専門に行っている
データベース・バッファ上のダーティ・ブロックを必要に応じて複数ブロック
単位でディスクに書き戻すのがDBWRの仕事です。折角のストライピングを意味
あるものにするためにDBWRのASYNC I/O(非同期I/O)を使用可能にします。そう
することで書き込みI/Oがパラレルで処理されI/O待ちを防ぐ事になります。こ
のときのベストな書き込みアクティビティは全てのストライプされたディスク
に対して均一なデータ量が書き込まれ、結果として書き込み処理が一瞬で終わ
る事です。したがってディスク・ドライブ数が十分であればOracleブロックサ
イズをストライピング・サイズの最小値とする事は意味があります。逆に、大
きなストライピング・サイズ、例えば512KB等を設定してしまうと書き込みアク
ティビティは均一化される可能性が低くなり、折角用意した多くのディスク・
ドライブによるストライピングが意味をなさなくなります。

Oracleの読み込み処理はユーザごとに行われる
データベース・バッファ上に存在しないOracleブロックの読み込みはユーザの
プロセス毎に行われます(MTSの場合は少し説明上の表現は違いますが今回は省
きます)。1回のI/O要求で読み込まれる最大の連続ブロックはdb_file_multiblock_read_count
で指定された値になります。この値は通常指定しないのでデフォルトの8ブロッ
クが一般的な単位と考えればよいでしょう。この場合もっとも効率的な読み込
みアクティビティは理論上は8個のディスク・ドライブにストライピングされた
「Oracleブロック単位のストライピング・サイズ」となると言えるかもしれま
せん?しかし、同時実行ユーザ数が高いシステムであれば「もう少しまとまっ
た単位で」連続ブロックを読み込んだほうが効率的になります。例えば、8ブロ
ックがひとつのストライピング・サイズに収まっていたら同時にRAID配下のディ
スク・ドライブ数分のトランザクションへの対処を理論上は引き出せます。同
時ユーザ数、すなわち同時トランザクション性能を引き出すためにはストライ
ピング・サイズはある程度大きいほうが良いのです。

ソフトウェアRAID?ハードウェアRAID?
同時トランザクション数を最大限に上げ、パフォーマンスを追及する場合であ
れば1回のI/Oアクティビティ単位だけで考えるのではなく同時トランザクショ
ン数単位で考えるのが得策です。したがって、Oracleブロックの大きさ以上で、
ディスク・ドライブ数に応じてですが、32KB、64KBなどが一般的です。ただ、
昨今のRAIDはハードウェアRAIDが主流となっているためそれぞれの得意のパタ
ーンがあります。また、ホットスペアを指定する場合などは設定できるストラ
イピングサイズが制限されます。
高価なハードウェアRAIDを購入する場合はそれぞれのトランザクションの特性
を踏まえてメーカーに相談するかコンサルタントから情報収集することが重要
です。また、少ないディスク・ドライブ数でデータの保護を中心に考慮したRAID
であれば512KBなどの大きなストライピング・サイズを選択することもあります。
しかし、それなりのディスク・ドライブ数で512KBを選択し、パフォーマンスが
出ないと悩んでいるのであればRAIDディスクのストライピングをやり直し!
ですね!
ご相談ください!

次号に続く、
茅ケ崎 フィッシャーマン