インデックスが使用されているか確認する方法について
検索パフォーマンスを上げるためにインデックスを使用しますが、そのインデックスが使用されているか確認したことありますか?
インデックスは検索パフォーマンスをあげる効果もありますがその反面、更新(INSERTやUPDATE等)する際にテーブルに対しての更新とインデックスに対しての更新が入るため処理に時間がかかります。
そのため使用してないインデックスがあると無駄な処理時間がかかってしまうことになります。
必要のないインデックスを確認して削除することによってパフォーマンスを改善しましょう。
インデックスが使用されているか確認する手順
インデックスが使用されているか確認の手順は、以下のとおりです。
- 使用されているか確認したいインデックスを監視対象にする。
- 一定期間をおいた後、インデックスが使われているのかSQLで確認する。
- 監視対象の解除する。
まず使用されているか確認したいインデックスを監視対象として登録します。
ただし監視対象にするということは、監視するためにパフォーマンスに多少影響がありますので、確認が終わったら監視対象から解除しましょう。
Oracleの12cR2からはデフォルトで自動で監視されているみたいです。(´・ω・`)
--使用されているか確認したいインデックスを監視対象にする。 ALTER INDEX <索引名> MONITORING USAGE; --一定期間をおいた後、インデックスが使われているのかSQLで確認する。 SELECT * FROM v$object_usage; --監視対象の解除する。 ALTER INDEX <索引名> NOMONITORING USAGE;
インデックスが使用されているか確認の実行例
以下のテーブルを使って検証をしていきます。
SQL> desc animal1; 名前 NULL? 型 --------------------- -------- ------------- ID VARCHAR2(10) NAME VARCHAR2(20) ADDRESS VARCHAR2(20)
以下のインデックスを使って検証をしていきます。
まだ監視対象に入ってないことがわかります。
SQL> SELECT index_name, table_name, column_name FROM user_ind_columns 2 WHERE table_name = UPPER('animal1'); INDEX_NAME TABLE_NAME COLUMN_NAME -------------------- -------------------- -------------------- ANIMAL1_ID_INDEX ANIMAL1 ID ANIMAL1_NAME_INDEX ANIMAL1 NAME SQL> SELECT * FROM v$object_usage; レコードが選択されませんでした。
使用されているか確認したいインデックスを監視対象にする。
上記のインデックスを監視対象にします。
ひとつずつインデックスを監視対象にする必要があります。
SQL> ALTER INDEX ANIMAL1_ID_INDEX MONITORING USAGE; 索引が変更されました。 SQL> ALTER INDEX ANIMAL1_NAME_INDEX MONITORING USAGE; 索引が変更されました。
一定期間をおいた後、インデックスが使われているのかSQLで確認する。
本来は一定期間、運用で使用されているか期間をおいた後、インデックスが使われているのかSQLで確認します。
「USED」列がYESの場合は使用されたことがあるインデックスです。NOの場合は、インデックスを使用されたことがないものです。
SQL> select count(id) from animal1; COUNT(ID) ---------- 4000000 SQL> SELECT * FROM v$object_usage; INDEX_NAME TABLE_NAME MONITORING USED START_MONITORING END_MONITORING -------------------- -------------- ----------- ------- ------------------------ -------------- ANIMAL1_ID_INDEX ANIMAL1 YES YES 09/07/2019 06:13:40 ANIMAL1_NAME_INDEX ANIMAL1 YES NO 09/07/2019 06:13:42
監視対象の解除する。
使用されていないインデックスの確認が終わったので、監視対象を外しましょう。監視対象に入れているとそれだけパフォーマンスに影響を与えてしまいます。
SQL> ALTER INDEX ANIMAL1_ID_INDEX NOMONITORING USAGE; 索引が変更されました。 SQL> ALTER INDEX ANIMAL1_NAME_INDEX NOMONITORING USAGE; 索引が変更されました。
インデックスの削除について
インデックスの削除方法については、別記事に書いているので参考にしてください。
Oracle インデックス(索引)の追加と削除する方法 「CREATE INDEX」「DROP INDEX」
コメント