マテリアライズドビューとは、クエリ結果のコピーを格納し、データを最新の状態に保つために定期的に(または手動で)更新される特殊なビューです。通常のビュー(仮想テーブル)とは異なり、マテリアライズドビューにはデータの物理的なコピーが含まれているため、複雑な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操作はサポートされていません。