パフォーマンスが落ちたインデックスを再作成して回復させよう運用管理の表ワザ裏ワザ Oracle編

» 2006年06月02日 20時32分 公開
[伏見文男,ITmedia]

Oracle 9i Databaseでパフォーマンスを向上させるためにインデックスを作成して利用していますが、データベースをしばらく運用していると、パフォーマンスが次第に低下していきます。改善方法はありますか?

対象製品:Oracle 9i Database

筆者の顧客にも「なんか最近パフォーマンスが悪いんだけど」と無邪気に言ってくる方がいます。そんなときには「気のせいですよ」とは言えず、どこの処理が遅いか、その処理はどのSQLを発行しているのかなどを調査します。最近は、OracleEnterprise Manager 10gによって簡単に特定および修正できるようになりましたが、過去のバージョンを使っている場合は、次のようにするとよいでしょう。

 たとえば、特定のSQL文がインデックススキャンをしていたとしましょう。インデックスは、パフォーマンスを上げる際の万能薬だと思われがちです。しかし、そのインデックスが遅くなることがあります。

 インデックス(ここでは一般的に使われるBツリーインデックス)が遅くなる理由は、大きく分けて2つです。ひとつはインデックスの更新を繰り返すうちに、いわゆる“歯抜け”の状態になったり、アンバランスになったりするケースです。もうひとつは、インデックスの階層が深くなっていくケースです。階層が深くなると、実データが格納されるリーフブロックまでのI/Oが増えるので、パフォーマンスは低下します。

 インデックスの状態は、INDEX_STATS ビューで簡単に確認することができます。

 図1の例では、階層の深さは「4」です。また、削除されたリーフ行は「40%(DEL_LF_ROW/LF_ROWS)」であることがわかります。私の経験上、深さが「4」を超えた場合、および削除されたリーフ行が30%を超えた場合は、インデックスの再作成をすることをお勧めしています。

図1 INDEX_STATS ビューの実行結果

SQL> Analy ze index index_name validate structure;

SQL> select NAME, HEIGHT, LF_ROWS, DEL_LF_ROWS

from INDEX_STATS;

NAME              HEIGHTLF_ROWS    DEL_LF_ROW
------------------------------ -------------------- ----------
INDEX_NAME           4100000       40000


このコンテンツはサーバセレクト2005年4月号に掲載されたものを再編集したものです。


Copyright© 2010 ITmedia, Inc. All Rights Reserved.

注目のテーマ