概要
マテリアライズドビューは従来のビューとは異なり、実際にクエリ結果のデータを格納します。簡単に言えば、マテリアライズドビューを作成すると、データベースは関連するSQLクエリを実行し、その結果セットをディスクに保存します。これにより、ビューのクエリ結果を事前に計算・保存することで、リアルタイムでの計算を削減し、クエリ性能を向上させるとともに複雑なクエリロジックを簡略化できます。主に、高速なレポート生成やデータ分析のシナリオで利用されます。
このドキュメントでは、マテリアライズドビューの仕組みについて説明します。フル更新と増分更新の実装原理、およびこれら2つの更新メカニズムがデータ更新においてどのように異なるかを紹介します。また、リアルタイムマテリアライズドビューの実装原理を説明し、更新の即時性、クエリ結果のリアルタイム性、正確性をどのように保証するかを論じます。
フル更新マテリアライズドビューの原理
フル更新戦略では、更新のたびにマテリアライズドビュー内の既存データをすべてクリアし、最新のクエリ結果セットを再挿入します。更新のたびにクリアされる隠れたコンテナテーブルのデータは、隠れたコンテナテーブルに新しいクエリ結果セットが正常に挿入された後、コンテナテーブルと交換されます。交換が成功した後にマテリアライズドビューをクエリした場合に得られる結果が、更新後の結果となります。
増分更新マテリアライズドビューの原理
増分更新の実装は、マテリアライズドビューのログに依存しています。マテリアライズドビューのログは、マテリアライズドビューのベーステーブル(つまり、マテリアライズドビューが参照するテーブル)のデータ変更を追跡する構造であり、前回の更新以降にベーステーブルで発生したすべての変更(挿入、更新、削除を含む)を記録します。
マテリアライズドビューのログは変更されたデータのみを処理し、変更を記録することで、マテリアライズドビューを迅速に増分更新し、マテリアライズドビューとベーステーブルのデータ一貫性を保証します。
増分更新戦略の方が効率的です。前回の更新以降に変更されたデータのみを処理し、その差分をマテリアライズドビューに適用します。すべての増分データ変更はマテリアライズドビューのログに記録され、変更された各行の旧値と新値が詳細に列挙されているため、データの正確性と即時性が保証されます。

上図のように、DML操作(例:INSERT、UPDATE)がベーステーブルに作用すると、DASメカニズムはベーステーブルとマテリアライズドビューのログを同時に更新することを保証します。バックグラウンドのメンテナンスタスクは定期的にマテリアライズドビューのログ内の増分変更をマテリアライズドビューに適用します。マテリアライズドビューのログの一部のデータがマテリアライズドビューに更新されると、削除モジュールによってクリアされます。この時点でのクエリ操作は、マテリアライズドビューとマテリアライズドビューのログ内でまだ更新されていないデータに同時にアクセスし、これらの情報を統合してユーザーに最新の結果セットを返します。
リアルタイムマテリアライズドビューの実装原理

OceanBaseはリアルタイムマテリアライズドビューをサポートしています。非リアルタイムマテリアライズドビューとの違いは、非リアルタイムマテリアライズドビューがMViewからのみデータをクエリするのに対し、リアルタイムマテリアライズドビューはMViewのデータをクエリするだけでなく、マテリアライズドビューのログ(Mlog)に記録されたベーステーブルデータの変更にもアクセスします。リアルタイムマテリアライズドビューは、クエリ実行時にオンラインでMViewとMlogのデータを計算し、リアルタイムのマテリアライズドビュー結果を返します。
リアルタイムマテリアライズドビューは増分更新と密接に関連しており、マテリアライズドビューのログを継続的にクエリすることで、ベーステーブルデータの最新の変更を迅速に捉え、マテリアライズドビューをリアルタイム更新状態に表示させます。