Oracleデータベースの運用管理者は、突発的に直面するパフォーマンス障害にどうやって対処したらよいか。本連載は、非常に複雑なOracleのアーキテクチャに頭を悩ます管理者に向け、短時間で問題を切り分け、対処法を見つけるノウハウを紹介する。対象とするバージョンはOracle8から9iまでを基本とし、10gの情報は随時加えていく。(編集局)
本連載ではOracleの挙動に問題を発見したとき、どうやって原因を特定し解決策を導き出すかについて解説してきました。最終回となる今回は、領域とディスクに関する障害克服のテクニックを紹介します。
Oracleがデータファイルの内部をどのように利用しているのか、その構造を理解するのは領域の問題解決には欠かせません。
Oracleはデータを階層構造によって管理しています。最上位にある「データベース(Database)」とは、「表領域(Tablespace)」の集まりです。表領域は1つまたは複数のデータファイルで構成されます。データベースの内容を物理的なデータファイルの視点からとらえた構造を「物理構造」と呼びます。
これに対して、データを保存する単位に着目した構造を「論理構造」と呼びます。この場合、データは「セグメント」「エクステント」「データ・ブロック」から構成されます。つまり、「表領域」は1つ以上の「セグメント」から、「セグメント」は1つ以上の「エクステント」から、エクステントは連続した「データ・ブロック」から構成されています。さらに、セグメントはOracle内部に保存されたオブジェクトを示します。表や索引など、オブジェクトの管理とは、データ管理として考えるとセグメントの管理ということになります。
表領域の自動拡張を設定していると、ハードディスクの容量に余裕がある場合はデータファイルの容量が自動的に拡張されるため、表領域がいっぱいになった場合でも問題なくデータベースを稼働させることができます。まずは自動拡張に設定されている表領域を確認し、表領域内の空き領域を調べてみましょう。
SQL> SELECT TABLESPACE_NAME, FILE_NAME, AUTOEXTENSIBLE FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = '表領域名';
SQL> SELECT SUM(BYTES) / 1024 || 'Kbytes' AS 空き領域サイズ FROM DBA_FREE_SPACE WHERE TABLESPACE_NAME = '表領域名';
次に表領域内に作成されるセグメント(表や索引などのオブジェクト)を構成するエクステントの数を確認してみましょう。ここで確認するエクステントの数が極端に多いと、各セグメントに設定されているエクステントのサイズに問題があることが考えられます。目安としては100以上のエクステント数を持つセグメントが多数あれば、パフォーマンスに悪影響を与えることがあります。特に索引のエクステントが多いと、RangeScanで検索するSQL処理でのパフォーマンスが低下します。
SQL> SELECT SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, EXTENTS FROM DBA_SEGMENTS WHERE TABLESPACE_NAME = '表領域名';
SQL> SELECT SEGMENT_NAME, EXTENT_ID, FILE_ID, BLOCK_ID, BLOCKS FROM DBA_EXTENTS WHERE OWNER = 'オーナー名' AND SEGMENT_NAME = 'セグメント名';
(次ページへ続く)
Copyright © ITmedia, Inc. All Rights Reserved.