マテリアライズドビューを利用すると、集計や結合を毎回実行せずに済むため、SQLの再計算コストを大幅に削減できます。特に大量データを扱う環境では、通常のビューや都度集計と比べてCPU負荷とディスクI/Oを抑えられます。本記事では、マテリアライズドビューの仕組みと、再計算コストを削減するための具体的な設定方法を解説します。
マテリアライズドビューとは
マテリアライズドビューは、SELECT文の実行結果を物理的に保存するデータベースオブジェクトです。
通常のビューは参照するたびにSQLを実行しますが、マテリアライズドビューは保存された結果を参照するため、処理負荷が軽減されます。
主な特徴は以下の通りです。
・SELECT結果を実データとして保持
・リフレッシュで内容を更新
・インデックスを作成可能
・通常の表と同じように参照可能
再計算コストが高くなる原因
SQLの再計算コストが高くなる主な要因は次の通りです。
・大規模テーブルを集計している
・複数テーブルを結合している
・GROUP BY や WHERE 条件が複雑
・同じ集計SQLが何度も実行されている
このようなケースでは、実行のたびに同じ計算処理が行われるため、CPU使用率とI/O負荷が増加します。
マテリアライズドビューでコストを削減できる理由
マテリアライズドビューは、計算済みの結果を保存します。
参照時には再計算を行わず、保存された結果を読み取るだけです。
そのため、次の効果があります。
・集計処理を省略できる
・実行計画が単純になる
・I/O回数が減少する
・レスポンスが安定する
日次集計や月次集計など、更新頻度が低く参照頻度が高いデータに特に有効です。
実行計画を確認することで、マテリアライズドビュー化すべきSQLかどうかを判断できます。実行計画の具体的な確認方法については、以下の記事で解説しています。
マテリアライズドビューの基本構文
代表的な構文例は次の通りです。
|
1 2 3 4 5 6 7 8 9 |
CREATE MATERIALIZED VIEW sales_summary_mv BUILD IMMEDIATE REFRESH COMPLETE AS SELECT product_id, SUM(amount) AS total_amount FROM sales GROUP BY product_id; |
設定項目の意味は以下の通りです。
| 項目 | 意味 |
|---|---|
| BUILD IMMEDIATE | 作成時に即時データを生成 |
| REFRESH COMPLETE | 全件再計算で更新 |
| AS SELECT | 保存対象のSQL |
再計算コストを抑える設定方法
FASTリフレッシュを利用する
FASTリフレッシュは、変更があった差分のみを更新する方式です。
全件再計算を行わないため、再計算コストを大幅に削減できます。
利用条件は以下の通りです。
・基表にマテリアライズドビューログが存在する
・SELECT文がFASTリフレッシュに対応している
設定例は以下の通りです。
|
1 2 3 |
CREATE MATERIALIZED VIEW LOG ON sales WITH ROWID, SEQUENCE (product_id, amount) INCLUDING NEW VALUES; |
|
1 2 3 4 5 6 7 8 |
CREATE MATERIALIZED VIEW sales_summary_mv REFRESH FAST AS SELECT product_id, SUM(amount) AS total_amount FROM sales GROUP BY product_id; |
ON DEMAND と ON COMMIT の使い分け
リフレッシュタイミングは主に2種類あります。
| 設定 | 特徴 |
|---|---|
| ON DEMAND | 手動またはスケジュールで更新 |
| ON COMMIT | COMMIT時に自動更新 |
大量更新が発生するテーブルでは ON DEMAND が適しています。
リアルタイム性が必要な場合のみ ON COMMIT を使用します。
COMPLETEリフレッシュを避ける
REFRESH COMPLETE は全件再計算を行います。
データ量が多い場合、実行のたびに大きな負荷が発生します。
可能な限り FAST リフレッシュを利用し、COMPLETE は最終手段とします。
運用面での工夫
マテリアライズドビューは運用方法によって効果が大きく変わります。
・夜間バッチでリフレッシュする
・参照専用として利用する
・不要に複雑なSQLを使わない
・検索条件に合わせてインデックスを作成する
特に参照専用にすることで、ロック競合や更新負荷を抑えられます。
通常のビューとの使い分け
| 利用ケース | 推奨 |
|---|---|
| 常に最新データが必要 | 通常のビュー |
| 集計が重く更新頻度が低い | マテリアライズドビュー |
| 参照回数が多い | マテリアライズドビュー |
| 更新が非常に多い | 通常のビュー |
よくある質問(Q & A)
- マテリアライズドビューは必ず高速化できますか?
-
集計や結合が重いSQLでは効果がありますが、単純なSELECTでは効果が小さい場合があります。
- FASTリフレッシュは必ず使用できますか?
-
SQLの構文に制限があります。外部表や一部関数を含む場合は利用できません。
- ON COMMITは危険ですか?
-
危険ではありませんが、更新ごとにリフレッシュが実行されるため、更新性能が低下する可能性があります。
- マテリアライズドビューにインデックスは作成できますか?
-
作成できます。検索条件に応じてインデックスを設定するとさらに高速化できます。
まとめ
マテリアライズドビューを利用すると、重い集計処理を事前に計算でき、SQLの再計算コストを削減できます。FASTリフレッシュを使えば更新コストも抑えられます。更新頻度と参照頻度を考慮し、ON DEMANDとON COMMITを使い分けることで、性能と運用のバランスを取ることが可能です。



