マテリアライズドビューは、クエリ結果のコピーを格納し、データの最新状態を維持するために定期的に(または手動で)更新される特殊なビューです。通常のビュー(仮想テーブルであり、アクセスするたびに再計算が必要)とは異なり、マテリアライズドビューにはデータの物理的コピーが含まれているため、複雑な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データベースは行ストレージ形式と列ストレージ形式のマテリアライズドビューをサポートしており、マテリアライズドビューの参照を含む複雑な分析シナリオでより良いクエリパフォーマンスを得ることができます。
主キーの使用
ユーザーはマテリアライズドビューに主キーを指定することができ、主キーに基づく単一行検索、範囲検索、または関連シナリオのパフォーマンスを最適化することができます。
パーティションの使用
マテリアライズドビューを作成する際にテーブルオプションを設定し、データの特性とアクセスパターンに基づいて適切なパーティションオプションを設計・構成することで、クエリパフォーマンスと管理効率を向上させることができます。
適用シナリオ
マテリアライズドビューは、特に大量のデータや複雑なクエリを処理する際のクエリパフォーマンスの最適化に使用されます。ビューのクエリ結果を事前に計算・保存することで、リアルタイム計算を削減し、クエリパフォーマンスを向上させ、複雑なクエリロジックを簡素化します。これは、レポートの高速生成やデータ分析シナリオで一般的に使用されます。
- 同一データへの頻繁なクエリ:マテリアライズドビューは、繰り返し計算が必要でリソース消費が多い複雑なクエリを格納するのに適しており、毎回のクエリ時の繰り返し計算を避け、クエリ効率を向上させます。
- データの事前集計:日次、週次、月次の販売データやユーザー行動データの集計など、レポート生成やデータ分析などのシナリオでは、マテリアライズドビューを利用して集計データを事前に計算・保存し、リアルタイム計算にかかる時間を短縮できます。
- 大規模データの分析:データ量が多い業務では、クエリは通常時間がかかります。マテリアライズドビューを利用することで、元のデータの大量スキャンを回避できます。
- リアルタイム分析:リアルタイム性が求められる業務では、リアルタイムマテリアライズドビューを利用してクエリを高速化し、業務のリアルタイム要件を満たすことができます。 *多次元データ分析:マテリアライズドビューを利用して、さまざまな次元の組み合わせにおける集計データを事前に計算し、高速な多次元クエリ応答を提供します。
注意点
- ストレージコスト:マテリアライズドビューは追加のストレージ容量を消費するため、ディスク容量を考慮する必要があります。
- リフレッシュ(メンテナンス)コスト:マテリアライズドビューの自動または手動リフレッシュはシステムリソースを消費します。ベーステーブルのデータ変更が頻繁な場合、リフレッシュ操作がシステムパフォーマンスに影響を与える可能性があります。
- データの一貫性とリアルタイム性:マテリアライズドビュー内のデータはリアルタイムではない場合があります。つまり、元のデータが更新されても自動的に更新されません。ベーステーブルのデータに変更があると、ビュー内のデータが古くなる可能性があるため、データの一貫性を保つために定期的なリフレッシュが必要です。
- 設計の複雑さ:マテリアライズドビューの設計と作成では、期待されるクエリパターンとデータアクセスパターンを慎重に検討し、最適なパフォーマンス最適化を実現する必要があります。
マテリアライズドビューのベーステーブル
データベースにおいて、マテリアライズドビューのベーステーブルとは、そのマテリアライズドビューを作成する際に参照された元のテーブルまたはビューを指します。
タイプ |
ベーステーブルとして使用できるか |
|---|---|
| 通常テーブル | はい |
| マテリアライズドビュー | はい |
| 通常ビュー | はい
説明OceanBaseデータベースでは、通常ビューを次元テーブル( |
| シノニム | いいえ |
| 外部テーブル | はい
説明OceanBaseデータベースでは、外部テーブルをマテリアライズドビューのベーステーブルとして使用し、フル更新用のマテリアライズドビューを作成できます。 |
使用制限
マテリアライズドビューに対して、データの挿入(INSERT)、削除(DELETE)、またはマテリアライズドビュー定義の変更(ALTER)操作は許可されません。
マテリアライズドビューのベーステーブルに対してDDL操作を実行すると、マテリアライズドビューが想定されたパターンでリフレッシュできなくなる可能性があります。
- フルリフレッシュの場合、マテリアライズドビューとベーステーブルの対応する列型が一致していればリフレッシュできます。
- 増分リフレッシュの場合、ベーステーブルにマテリアライズドビューのログを作成するか(またはマテリアライズドビューのログ自動管理機能を有効にする必要があります)。
マテリアライズドビューは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操作はサポートされていません。