概要
マテリアライズドビューは従来のビューとは異なり、実際にクエリ結果のデータを格納しています。簡単に言えば、マテリアライズドビューを作成すると、データベースは関連するSQLクエリを実行し、その結果セットをディスク上に保存します。これにより、事前計算とビューのクエリ結果のストレージを通じてリアルタイム計算を削減し、クエリ性能を向上させるとともに複雑なクエリロジックを簡素化します。主に迅速なレポート生成やデータ分析のシナリオで利用されます。
このドキュメントでは、フル更新と増分更新の実装原理、およびこれら二つの更新メカニズムがデータ更新においてどのように異なるかを含む、マテリアライズドビューの仕組みについて説明します。また、リアルタイムマテリアライズドビューの実装原理についても紹介し、それがどのように更新の適時性、クエリ結果のリアルタイム性、および正確性を保証するのかを説明します。
フル更新マテリアライズドビューの原理
フル更新戦略では、各更新時にマテリアライズドビュー内の既存データをすべてクリアし、最新のクエリ結果セットを再挿入します。各更新時にクリアされる隠れコンテナテーブルのデータは、隠れコンテナテーブルに新しいクエリ結果セットが正常に挿入された後、コンテナテーブルと交換されます。交換が成功した後にマテリアライズドビューを照会した場合、その結果が更新後の結果となります。
増分更新マテリアライズドビューの原理
増分更新の実装は、マテリアライズドビューログに依存します。マテリアライズドビューログとは、マテリアライズドビューの基底テーブル(つまりマテリアライズドビューによって参照されるテーブル)のデータ変更を追跡するための構造であり、前回の更新以降に基底テーブルで発生したすべての変更、挿入、更新、削除を記録します。
マテリアライズドビューログは変更されたデータのみを処理し、変更を記録することで、マテリアライズドビューを迅速に増分更新し、マテリアライズドビューと基底テーブルのデータの一貫性を保証します。
増分更新戦略はより効率的であり、前回の更新以降に変更されたデータのみを処理し、これらの差分をマテリアライズドビューに適用します。すべての増分データ変更はマテリアライズドビューログに記録され、変更されたすべての行の古い値と新しい値が詳細にリストアップされるため、データの正確性と適時性が保証されます。
上図のように、基底テーブルに対してDML操作(例えばINSERT、UPDATE)が実行されると、DASメカニズムは基底テーブルとマテリアライズドビューログを同時に更新します。バックグラウンドのメンテナンスタスクは定期的にマテリアライズドビューログ内の増分変更をマテリアライズドビューに適用します。マテリアライズドビューログ内の一部データがマテリアライズドビューにフラッシュされると、削除モジュールによってクリアされます。この時点で、クエリ操作はマテリアライズドビューとマテリアライズドビューログ内の未フラッシュデータに同時にアクセスし、これらの情報を統合して最新の結果セットをユーザーに返します。
リアルタイムマテリアライズドビューの実装原理
OceanBaseはリアルタイムマテリアライズドビューをサポートしており、非リアルタイムマテリアライズドビューとの違いは以下のとおりです:非リアルタイムマテリアライズドビューはMViewからのみデータを照会しますが、リアルタイムマテリアライズドビューはMView内のデータを照会するだけでなく、基底テーブルデータの変更にもアクセスします。これらの変更はマテリアライズドビューログ(Mlog)に記録されます。リアルタイムマテリアライズドビューは、クエリ実行時にオンラインでMViewおよびMlog内のデータを計算することで、リアルタイムのマテリアライズドビュー結果を返します。
リアルタイムマテリアライズドビューは増分更新と密接に関連しており、マテリアライズドビューログを継続的に照会することで、基底テーブルデータの最新の変更を迅速に捉え、マテリアライズドビューをリアルタイム更新状態に表示します。