マテリアライズドビューとは、クエリ結果のコピーを格納し、データを最新の状態に保つために定期的に(または手動で)更新される特殊なビューです。通常のビュー(仮想テーブル)とは異なり、マテリアライズドビューにはデータの物理的なコピーが含まれているため、複雑なSQLクエリ文を実行することなく直接マテリアライズドビューからデータを照会できます。これにより、クエリ性能が大幅に向上し、時間をかける代わりに空間を利用してクエリを高速化します。
機能特性
マテリアライズドビューの種類
非リアルタイムマテリアライズドビュー
非リアルタイムマテリアライズドビューとは、その名が示す通り、ビューに格納される結果セットが最新ではないものです。これは、ベーステーブルが更新されるたびに即座にマテリアライズドビューを更新するわけではなく、あらかじめ設定された時間間隔や手動トリガーによってのみ更新されます。また、マテリアライズドビューへのクエリ時には、実際に物理的に保存されているデータのみが照会されます。この方式は、データの新鮮さに対する要求はそれほど高くないものの、クエリ性能に対するニーズが高いシナリオに適しています。
リアルタイムマテリアライズドビュー
リアルタイムマテリアライズドビューは、リアルタイムデータの取得をサポートするデータベースオブジェクトであり、mlogの仕組みを利用して下層のベーステーブルの変更をキャプチャ・処理し、マテリアライズドビュー内のデータが最新状態を迅速に反映できるようにします。クエリ実行時には、リアルタイムマテリアライズドビューがオンライン計算を通じてこれらの変更を即時統合し、ユーザーに更新後のデータを表示します。このように、マテリアライズドビューに最新データが物理的に保存されていなくても、ユーザーはリアルタイムで更新されたクエリ結果を得ることができます。
マテリアライズドビューのリフレッシュ戦略
OceanBaseデータベースのマテリアライズドビューは、フルリフレッシュ、増分リフレッシュ(高速リフレッシュ)、ハイブリッドリフレッシュ、および決してリフレッシュしないという4種類のリフレッシュ戦略をサポートしています。具体的には以下の通りです:
フルリフレッシュ
フルリフレッシュは比較的直接的な方法であり、リフレッシュ操作を実行するたびに、システムはマテリアライズドビューに対応するクエリステートメントを再実行し、元のビュー結果データを完全に計算して上書きします。この方式は、データ量が比較的小さいシナリオに適しています。
増分リフレッシュ
増分リフレッシュでは、前回のリフレッシュ以降に変更された部分のみを処理します。正確な増分リフレッシュを実現するために、OceanBaseはOracleのMLOG(Materialized View Log)に似たマテリアライズドビューログ機能を実装しており、ログを通じて基礎テーブルの増分更新データを詳細に追跡記録することで、マテリアライズドビューが迅速な増分リフレッシュを行えるようにしています。増分リフレッシュ方式は特に、データ量が膨大で変更頻度が高い業務シナリオに適しています。
ハイブリッドリフレッシュ
最初に増分リフレッシュを試み、増分リフレッシュに失敗した場合はフルリフレッシュを実行します。
決してリフレッシュしない
マテリアライズドビューは作成時にのみリフレッシュされ、作成後は再度リフレッシュすることが許可されません。
マテリアライズドビューのリフレッシュ方式
OceanBaseデータベースのマテリアライズドビューのリフレッシュ方式には、自動リフレッシュと手動リフレッシュが含まれます。
自動リフレッシュ
マテリアライズドビューを作成する際に、リフレッシュのタイミングを設定し、自動リフレッシュの時間間隔を設定できます。
START WITH datetime_exprおよびNEXT datetime_expr句を指定することで、マテリアライズドビューに対するバックグラウンドでの自動リフレッシュスケジュールのタイミングを設定できます。手動リフレッシュ
マテリアライズドビューに自動リフレッシュが設定されていない場合、または自動リフレッシュの間隔が長い場合は、
DBMS_MVIEW.REFRESHパッケージを使用して手動リフレッシュを行い、マテリアライズドビューのデータとベーステーブルのデータを同期状態に保つことができます。
マテリアライズドビューによるクエリの高速化
クエリの書き換え
マテリアライズドビューを作成する際に、
ENABLE QUERY REWRITEを指定することで、マテリアライズドビューの自動書き換え機能を使用できます。この場合、システムは元のテーブルに対するクエリをマテリアライズドビューに対するクエリに書き換えることができ、これにより業務改修量を削減できます。インデックスの使用
自社の業務ニーズに応じて、特定のフィールドにインデックスを作成することで、これらのフィールドに対するクエリ速度を向上させることができます。
データストレージ形式の選択
OceanBaseデータベースは以前(V4.3.0からV4.3.2まで)、行ストア形式のマテリアライズドビューのみをサポートしていましたが、V4.3.3バージョンからはカラムストア形式のマテリアライズドビューもサポートされるようになり、一部の複雑な分析シナリオにおいてマテリアライズドビューを参照する場合、より優れたクエリ性能を得ることができます。
主キーの使用
ユーザーはマテリアライズドビューに主キーを指定することができ、これにより主キーに基づく単一行検索、範囲クエリ、または関連シナリオのパフォーマンスを最適化できます。
パーティションの使用
マテリアライズドビューを作成する際に、テーブルオプションを設定し、データの特性とアクセスパターンに基づいて適切なパーティションオプションを設計・構成することで、クエリ性能と管理効率を向上させることができます。
適用シナリオ
マテリアライズドビューは、特に大量のデータや複雑なクエリを処理する際に、クエリ性能を最適化するために使用されます。それは、事前計算とビューのクエリ結果の保存により、リアルタイム計算を削減してクエリ性能を向上させ、複雑なクエリロジックを簡素化することで、迅速なレポート生成やデータ分析シナリオでよく使用されます。
- 同じデータの頻繁なクエリ:マテリアライズドビューは、繰り返し計算が必要でリソース消費が多い複雑なクエリを保存するのに適しており、毎回のクエリ時に繰り返し計算を行うことを避け、クエリ効率を向上させます。
- データの事前集計:日次、週次、または月次の販売データ、ユーザー行動データの統計などを集計する場合、例えばレポート生成やデータ分析などのシナリオでは、マテリアライズドビューを使用して集計データを事前計算・保存することで、リアルタイム計算にかかる時間を短縮できます。
- 大規模データ量の分析:データ量が多い業務では、クエリは通常時間がかかるものですが、マテリアライズドビューを利用することで、元のデータに対する大量のスキャンを回避できます。
- リアルタイム分析:リアルタイム性が求められる業務では、リアルタイムマテリアライズドビューを利用してクエリを高速化し、業務のリアルタイム要件を満たすことができます。
- 多次元データ分析:マテリアライズドビューを利用して、各種次元の組み合わせにおける集計データを事前計算し、迅速な多次元クエリ応答を提供します。
注意事項
- ストレージコスト:マテリアライズドビューは追加のストレージ領域を占有するため、ディスク容量を考慮する必要があります。
- フレッシュ(メンテナンス)コスト:マテリアライズドビューの自動または手動フレッシュはシステムリソースを消費します。基礎テーブルのデータ変更が頻繁な場合、フレッシュ操作がシステムパフォーマンスに影響を与える可能性があります。
- データの一貫性とリアルタイム性:マテリアライズドビュー内のデータはリアルタイムではない場合があり、つまり元のデータが更新されても自動的に更新されないことがあります。基礎テーブルのデータに変更があると、ビュー内のデータが古くなる可能性があり、データの一貫性を維持するために定期的なフレッシュが必要です。
- 設計の複雑さ:マテリアライズドビューの設計と作成には、期待されるクエリパターンとデータアクセスパターンを慎重に検討し、最適なパフォーマンスの最適化を実現する必要があります。
マテリアライズドビューのベーステーブル
データベースにおいて、マテリアライズドビューのベーステーブルとは、そのマテリアライズドビューを作成する際に参照される元のテーブルまたはビューを指します。
| タイプ | ベーステーブルとして使用できるか |
|---|---|
| 通常テーブル | はい |
| マテリアライズドビュー | はい |
| 通常ビュー | はい
説明OceanBase データベース V4.3.5 バージョンにおいて、V4.3.5 BP5 バージョンより、通常のビューをディメンションテーブル( |
| シノニム | 不可 |
| 外部テーブル | はい
説明OceanBaseデータベースV4.3.5バージョンでは、V4.3.5 BP2バージョンから外部テーブルをマテリアライズドビューのベーステーブルとして使用し、フル更新マテリアライズドビューを作成できるようになりました。 |
使用制限
マテリアライズドビューに対して、データの追加(INSERT)、削除(DELETE)、またはマテリアライズドビュー定義の変更(ALTER)操作を行うことは許可されていません。
マテリアライズドビューのベーステーブルに対してDDL操作を実行すると、マテリアライズドビューが予想どおりのモードでフレッシュできなくなる可能性があります。
フルフレッシュの場合、マテリアライズドビューとベーステーブルの対応する列型が一致していれば、フレッシュできます。
インクリメンタルフレッシュの場合、ベーステーブル上にマテリアライズドビューログを作成するか(またはマテリアライズドビューログの自動管理機能を有効にする)必要があり、それによってインクリメンタルフレッシュが可能になります。
説明
V4.3.5バージョンでは、V4.3.5 BP4バージョンからマテリアライズドビューログの自動管理機能がサポートされています。詳細については、マテリアライズドビューログの自動管理を参照してください。
マテリアライズドビューはXML型をサポートしていません。
マテリアライズドビューはテーブルレベルの復旧をサポートしていません。
マテリアライズドビューを個別に削除する場合、マテリアライズドビューはゴミ箱には入りません。
drop databaseの場合は、databaseとともにゴミ箱に入ります。マテリアライズドビューに主キーを指定した後、メンテナンス/更新時にデータが主キー制約を満たさない場合、ビューのメンテナンスに失敗します。例えば、
CREATE MATERIALIZED VIEW mv1(PRIMARY KEY(c1)) AS SELECT c1 FROM t1;でマテリアライズドビューmv1を作成する際、t1内のc1列にnull値が存在すると、マテリアライズドビューのデータを作成・メンテナンスする際にエラーが発生します。
操作権限
- マテリアライズドビューを作成するには、
CREATE TABLE権限が必要です。 - マテリアライズドビューを削除するには、
DROP TABLE権限が必要です。 - フルフレッシュには、すべてのベーステーブルに対する
SELECT権限が必要です。 - インクリメンタルフレッシュには、すべてのベーステーブルに対する
SELECT権限と、対応するマテリアライズドビューログに対するSELECT権限が必要です。 - マテリアライズドビューには
SELECT権限のみを付与でき、他のDML操作はサポートされていません。