【ORACLE】マテリアライズドビューが遅い原因とSQLチューニング

ここではORACLEデータベースのSQLでマテリアライズドビュー(Materialized View)が遅いときの原因とチューニング方法を紹介します。

通常のビューが遅いときは↓を参考にしてください。
>>【ORACLE】ビュー(VIEW)が遅いときの原因とSQLチューニング方法

マテリアライズドビューとは

マテリアライズドビューとは、あるテーブルから取得した検索結果を保持するビューです。

通常のビューがレコードを持たない仮想表ですが、マテリアライズドビューはデータの実体を持つ表です。

マテリアライズドビューが遅くなる原因

”マテリアライズドビューが遅い”と言う言葉には2つの意味があると思います。

1つ目はマテリアライズドビューのSELECTに時間がかかる場合です。
2つ目はマテリアライズドビューのリフレッシュに時間がかかる場合です。

それぞれの場合に分けて解説していきます。

1.SELECTに時間がかかる

マテリアライズドビューは、ビューとは違い、実体を持つ通常のテーブルとほぼ同じです。

SELECTが遅くなる原因も通常のテーブルへのアクセスが遅くなるのと同じです。

突然遅くなったのであれば、データが急増したことによってデータの状態と統計情報との乖離が発生している場合などです。

その他にもいくつか原因は考えられます。SQLが遅くなる原因は↓で紹介していますので参考にしてみてください。
>>SQLが突然遅くなる原因と対応方法

2.リフレッシュに時間がかかる

マテリアライズドビューのリフレッシュに時間がかかることがあります。

マテリアライズドビューを完全リフレッシュしたときは、保持しているデータを削除し、マテリアライズドビューで定義したSELECT文がINSERT文に変換されて実行され、新たなレコードが登録されます。

リフレッシュで時間がかかるときは、定義しておいたSELECT文の実行時間が遅いことが多くあります。

まずは「【SQL】長時間処理や遅いSQLを確認する方法」で時間のかかっているINSERT-SELECT文を探します。そしてSELECT文のどこが遅いのか分析する必要があります。

SQLが特定できれば、実行計画を確認し、チューニングを行います。
>>【ORACLE】SQLの実行計画を取得する方法
>>【ORACLE】SQLの実行計画の見方

単純に統計情報が最新でない場合もあれば、SQLが複雑で遅くなっている場合もあります。まずはSQLが遅い原因を特定しましょう。
>>SQLが突然遅くなる原因と対応方法

チューニングする方法

マテリアライズドビューが遅い状況に合わせてチューニングを行います。

1.SELECTで時間がかかる場合のチューニング

マテリアライズドビューの参照やレコードの取得に時間がかかっているSQLをチューニングします。

マテリアライズドビューは通常のテーブルと同じで、索引(インデックス)を作成することが出来ます。

レコードの抽出に時間がかかっているようであれば、インデックスによる改善が見込めます。
>>SELECT文が遅いときのインデックス作成によるチューニング方法

その他、SQLのチューニング方法は通常のSQLと同じように行うことで改善を狙うことが出来ます。SQLチューニングについては↓で紹介していますので参考にしてください。
>>SELECT文のSQLチューニング方法まとめ

2.リフレッシュに時間がかかる場合

マテリアライズドビューのリフレッシュに時間がかかる場合は、定義したSELECT文をチューニングします。

マテリアライズドビューの定義したSELECT文で参照しているテーブルにインデックスを作成することもできます。

他にも定義したSELECT文にヒントを書くこともできます。SQLヒントについては↓で紹介していますのでぜひ参考にしてください。
>>ORACLE SQLのヒントとは

SQLのチューニングの他には、マテリアライズドビューの実行間隔や実行する時間帯、あるいはリフレッシュ方法を見直すことで改善することもあります。

まとめ

マテリアライズドビューのチューニングは次の観点で行う
 1.SELECTで時間がかかる
  ・マテリアライズドビューへインデックスの作成
  ・SELECT文のチューニング
 2.リフレッシュに時間がかかる
  ・定義したSELECT文のチューニング
  ・リフレッシュの時間帯や時間間隔、方法の見直し