マテリアライズドビュー(Materialized View, MV)はデータベースオブジェクトの一種で、通常のビューとは異なり、ビューのクエリ結果を格納しています。集計や結合など時間のかかる操作の結果を保存し、クエリ時に直接再利用することで、これらの時間とリソースを消費する操作の繰り返し実行を回避し、結果的にクエリの高速化を実現します。特にデータウェアハウスや意思決定支援システムにおいて、計算時間を大幅に短縮し、クエリ効率を向上させることができます。
AP/リアルタイムデータウェアハウスでマテリアライズドビューを使用する理由
- 重複計算の削減:多次元分析、ワイドテーブルの結合、定期レポートでは同じJOIN/GROUP BYが繰り返し発生することがよくあります。マテリアライズドビューにすることで、更新タスクによって一元的に管理されます。
- 鮮度とコストの制御:フル/増分/リアルタイム(オンデマンド) などの戦略を通じて、遅延とリソース消費の間でトレードオフを行います(機能の選定については マテリアライズドビューの典型的なユースケースと実践 を参照)。
- その他のAP機能との組み合わせ:例えば、カラムナ形式 のマテリアライズドビュー結果、クエリのリライト でヒットしたマテリアライズドビュー結果、外部テーブル と組み合わせてレイクハウスを実現する方法などです(シナリオと手順SQLについては マテリアライズドビューの典型的なユースケースと実践 を参照)。
適用シナリオ
- データ集計:取引明細や行動履歴などを日/週/月単位で集計します。
- 定型レポート / 指標層:指標表を事前に計算し、レポートやAPIクエリで利用します。
- 重複クエリの最適化:リソース消費が激しいSQLの結果をマテリアライズし、繰り返し実行を回避します。
- データの近接性とレプリカ戦略(ビジネス計画に基づく):コンプライアンスを前提として集計結果を冗長化し、ルーティングおよびレプリカ戦略と組み合わせて使用します。
- 監視系の事前集計:時間粒度で監視明細を事前に集計します。
コア機能
クエリの高速化
単一テーブルの集計:業務上、単一テーブルの既存データが多く、頻繁にグループ集計を伴うクエリが必要なシナリオでは、単一テーブルのグループ集計に対する増分更新(refresh fast)マテリアライズドビューを作成できます。クエリ時に最新の変更をマージする必要がある場合は、条件を満たす場合に リアルタイムマテリアライズドビュー(ENABLE ON QUERY COMPUTATION) を使用できます。
複数テーブルの結合:業務上、複数テーブルの既存データが多く、頻繁に結合クエリが必要なシナリオでは、複数テーブル結合に対する増分更新(refresh fast)マテリアライズドビューを作成できます。複数テーブルJOINタイプのマテリアライズドビューは、データのメンテナンスを適切に行った後、クエリのリライト と組み合わせることで、ベーステーブルへのクエリを自動的にマテリアライズド結果に転送します。
マテリアライズドビューとリアルタイムデータウェアハウス
OceanBaseのAP / リアルタイムデータウェアハウスシナリオにおいて、マテリアライズドビューは、明細またはワイドテーブル上の繰り返し計算を更新可能な物理結果セットとして沈殿させ、時間(バッチ/準リアルタイム)、空間(次元/粒度)、テーマ(ビジネス領域)にわたって多次元集計と派生指標を整理するためによく使用されます。カラムストア、クエリのリライト、増分更新などと組み合わせることで、オンライン分析におけるベーステーブルのスキャンと計算負荷を軽減できます。
リアルタイムデータウェアハウスにおけるマテリアライズドビューの役割
典型的なリアルタイムまたは準リアルタイムデータウェアハウスのパイプラインは、次のように要約できます:接続(CDC / ファイル / 外部テーブル)→ 詳細層(DWD)→ 集計・テーマ層(DWS / ADS)→ クエリ・レポート。マテリアライズドビューは、このパイプライン内の 繰り返し可能な集計、結合、ワイドテーブルの展開 の処理を担うのに適しています。
- 多次元集計:地域、カテゴリ、時間窓などでファクトテーブルに対して
GROUP BYを行い、次元と結合します。 - データ階層化:フル / 増分 / リアルタイムマテリアライズドビュー と 定時または手動更新 を組み合わせることで、遅延、リソース使用量、結果の一貫性 の間でトレードオフを実現します。
- クエリの高速化:詳細テーブルへのSQLアクセスを維持したまま、クエリの再構成 により自動的にマテリアライズドビューの結果を参照する経路に変更し、業務システムへの改修を軽減します。
詳細については、マテリアライズドビューの概要(MySQL)およびマテリアライズドビューの概要(Oracle)を参照してください。
リフレッシュ機能:マテリアライズドビューの結果をベーステーブルと同期する
マテリアライズドビューは、リフレッシュポリシー を通じてベーステーブルのデータと同期する必要があります。
機能のポイント |
説明 |
実践への入口 |
|---|---|---|
| フル更新 | 定義に従って毎回再計算し、結果を上書きする。定義が複雑で、長いウィンドウを許容するか、完全な整合性が必要なシナリオに適しています。 | マテリアライズドビューの更新(MySQL)、マテリアライズドビューの更新(Oracle) |
| 増分更新(高速更新) | Mlog に基づいて変更を処理するため、ベーステーブルが大きく、変更が比較的局所的なシナリオに適しています。SQL 形式に制限があります。 | 上記と同じです。Mlog については、マテリアライズドビューのログ(MySQLモード)およびマテリアライズドビューのログ(Oracleモード)を参照してください。 |
| 自動/手動更新 | 作成時にスケジュールを設定できます。また、必要に応じて手動で更新することもできます(例:DBMS_MVIEW.REFRESH)。 |
マテリアライズドビューの作成(MySQL)、マテリアライズドビューの作成(Oracle) |
| Mlogの自動管理 | サポートされているバージョンでは、Mlogの手動メンテナンスコストを削減します。 | マテリアライズドビューのログの自動管理(MySQLモード)、マテリアライズドビューのログの自動管理(Oracleモード) |
| 更新リソースの分離 | バッチ更新とMlogのメンテナンスをオンライン負荷から分離できます。 | マテリアライズドビューのリソース分離(MySQLモード)、マテリアライズドビューのリソース分離(Oracleモード) |
並列度は、mview_refresh_dopなどの変数を組み合わせてチューニングできます。
クエリのリライト機能:業務SQLをあまり変更せずにマテリアライズドビューの結果を取得できる
クエリのリライトとは、オプティマイザーがベーステーブル(または等価な意味)に対するクエリを既存のマテリアライズドビューにマッチングし、事前計算された結果でクエリに応答することです。
- マテリアライズドビュー作成時に**
ENABLE QUERY REWRITE**を有効にできます(具体的な構文と制限はマニュアルを参照してください)。 - リライトはセッション/グローバル変数の影響を受けます。例:query_rewrite_enabled、query_rewrite_integrity。
詳細なルールと例については、マテリアライズドビューによるクエリのリライト(MySQL)およびマテリアライズドビューによるクエリのリライト(Oracle)を参照してください。
マテリアライズドビューの機能と選定
前述の「リアルタイムデータウェアハウスの位置付け、更新能力、クエリのリライト能力」と重複を避けるため、このセクションでは意思決定レベルの簡潔なポイントのみを記載します。サンプルとSQLは後述の各章を参照してください。
リフレッシュポリシー(フル / 増分 / 自動 / 手動)
- フルリフレッシュ(Complete):リフレッシュするたびに、マテリアライズドビューはクエリステートメントを再実行し、計算結果で既存のビュー結果データを上書きします。レイテンシ要求が低く、ベーステーブルのデータ更新頻度が低い、クエリステートメントが複雑である、またはデータ量が小さいシナリオに適しています。
- 増分リフレッシュ(Fast):高速リフレッシュ(Fast Refresh)とも呼ばれます。増分リフレッシュはマテリアライズドビューのログ(Materialized View Log、Mlog)に依存しており、クエリステートメントに一定の要件があります。現在、単一テーブルの集計、複数テーブルの結合、および複数テーブルの結合と集計のクエリステートメントをサポートしており、集計関数と結合方法には大規模データ量と高頻度変更シナリオに適した要件があります。
- 自動リフレッシュ:マテリアライズドビュー作成時に、そのリフレッシュ間隔を指定できます。システムは設定されたリフレッシュ時間ルールに基づいて、マテリアライズドビューのリフレッシュタスクを自動的にスケジュールします。
- 手動リフレッシュ:マテリアライズドビューに自動リフレッシュが設定されていない、または自動リフレッシュの間隔が長い場合、マテリアライズドビューのリフレッシュコマンドを手動で実行し、マテリアライズドビューのデータとベーステーブルのデータを同期状態に保つことができます。
詳細な構文と制限については、マテリアライズドビューのリフレッシュ(MySQL)およびマテリアライズドビューのリフレッシュ(Oracle)を参照してください。
リアルタイムマテリアライズドビュー(ON QUERY COMPUTATION)
リアルタイムマテリアライズドビュー(Real-Time Materialized Views)は、その名の通り、マテリアライズドビューをクエリすることでリアルタイムのデータを取得できるものです。クエリ結果はベーステーブルを直接クエリした場合と同じであり、マテリアライズドビューで事前に計算された結果を活用してクエリを高速化できます。Mlogのメカニズムを使用して基盤となるベーステーブルの変更を捕捉・処理することで、マテリアライズドビュー内のデータが常に最新の状態を反映するようにします。Mlogに依存するため、リアルタイムマテリアライズドビューのクエリステートメントには増分リフレッシュのマテリアライズドビューと同じ要件があります。つまり、対応するマテリアライズドビューをリアルタイムマテリアライズドビューとして定義するには、増分リフレッシュのマテリアライズドビューの要件を満たす必要があります。
リアルタイムマテリアライズドビューの作成に関する詳細情報については、MySQLモードでのマテリアライズドビューの作成およびOracleモードでのマテリアライズドビューの作成を参照してください。
ネストマテリアライズドビュー
ネストマテリアライズドビューとは、あるマテリアライズドビューが別のマテリアライズドビューによって参照・依存されている構造を指します。この方式はETL(抽出・変換・ロード)プロセスにおいて非常に有効であり、ETLパイプライン内で異なる段階のデータ集計や変換結果を独立したビューとして格納することで、繰り返し計算を回避し、ETL全体の効率を向上させます。ネストマテリアライズドビューは自動連鎖更新をサポートしていないため、使用する前にはその更新に関する注意事項を確認し、上位レベルのマテリアライズドビューから取得するデータ結果が期待通りであることを保証する必要があります。
ネストマテリアライズドビューの作成方法の詳細については、MySQLモードでのマテリアライズドビューの作成およびOracleモードでのマテリアライズドビューの作成を参照してください。
クエリのリライト(ENABLE QUERY REWRITE)
マテリアライズドビューを活用してクエリを高速化したいが、元のクエリステートメントを変更したくない場合、マテリアライズドビューのクエリリライト機能を利用できます。システムはクエリステートメントとマテリアライズドビューの定義を自動的に照合し、一致するマテリアライズドビューを見つけた場合、クエリをマテリアライズドビューを使用するクエリに自動的にリライトします。これにより、業務上の変更を加えることなく、クエリのパフォーマンスと効率を大幅に向上させることができます。
マテリアライズドビューによるクエリリライトの詳細については、MySQLモードでのマテリアライズドビューによるクエリリライトおよびOracleモードでのマテリアライズドビューによるクエリリライトを参照してください。
クエリ高速化の最適化手法
最適化の観点 |
推奨事項 |
適用シナリオ |
メリット |
|---|---|---|---|
| クエリ形式に応じたマテリアライズド結果ストレージの選択 | 広いテーブルの分析はカラムストア、行レベルのアクセスは行ストアを優先する。 | スキャン効率と行アクセス効率のバランスが必要なシナリオ。 | 不要な列の読み取りを削減し、I/Oを低減してクエリ効率を向上させる。 |
| マテリアライズドビューのデータストレージ形式 | 実際のアプリケーションシナリオに応じて行ストアまたはカラムストアを選択する。行ストアは「結果が集計されており、行単位でのアクセスが主な場合」に適しており、カラムストアは「広いテーブル + 集計分析が主な場合」に適している。 | レポートの集計、広いテーブルの分析、固定指標のクエリ。 | アクセスパターンにより密着し、スキャンオーバーヘッドを低減する。 |
| 主キーマテリアライズドビューの使用 | マテリアライズドビューに主キーを定義し、結果セットの一意性を保証する。 | 安定的な位置付け、更新、または重複除去が必要なマテリアライズド結果。 | 検索と更新の効率を向上させ、重複データのリスクを低減する。 |
| マテリアライズドビューに基づくインデックスの作成 | フィルター列、関連列、ソート列に基づいてインデックスを作成する。 | 高頻度のフィルタリング、関連付け、ソートクエリ。 | 全表スキャンを削減し、ヒットパスを高速化する。 |
| SLAに基づくリフレッシュ戦略の調整 | 「遅延、鮮度、リソース」の間でバランスを取り、必要に応じてフル/増分、自動/手動リフレッシュを選択する。 | 統計精度レベルの異なるAP/レポートシナリオ。 | 即時性を盲目的に追求することなく、リソースコストを管理しながら可用性を維持する。 |
マテリアライズドビューはクエリ高速化の重要な手段です。大規模データシナリオでは、「ストレージ形式 + インデックス + 更新戦略」の3つを協調させることで、クエリパフォーマンスを継続的に最適化できます。
マテリアライズドビューの作成例
注意
以下の例はすべてMySQLモードで実行されます。
ソーステーブルの作成
まず、元データを格納するためのソーステーブルを作成します。この例では、販売データと商品情報を含む sales テーブルと items テーブルを作成します。
販売データテーブル
salesを作成します。CREATE TABLE sales ( order_id INT PRIMARY KEY, user_id INT, item_id INT, item_count INT, region VARCHAR(100) );商品情報テーブル
itemsを作成します。CREATE TABLE items ( order_id INT, product_id INT, quantity INT, price_per_item DECIMAL(10, 2) NOT NULL, pic_url VARCHAR(1000), PRIMARY KEY (order_id, product_id) );
フル更新マテリアライズドビューの作成
sales テーブルに基づくマテリアライズドビューを作成します。このマテリアライズドビューは、製品と地域ごとに販売量を集計し、クエリの高速化を図ります。
製品と地域ごとに販売量を集計したマテリアライズドビュー mv_sales_summary を作成します。
CREATE MATERIALIZED VIEW mv_sales_summary(PRIMARY KEY(item_id))
REFRESH COMPLETE
START WITH sysdate()
NEXT sysdate() + interval 1 hour
AS SELECT item_id, region, SUM(item_count) AS total_count
FROM sales
GROUP BY item_id, region;
このマテリアライズドビューの作成例では、以下の特性を指定しています:
- PRIMARY KEY:マテリアライズドビューに主キーを指定します。
REFRESH COMPLETE:フル更新方式を採用します。START WITH sysdate() NEXT sysdate() + interval 1 hour:1時間ごとに定期的に更新します。
増分更新マテリアライズドビューの作成
データの変更が頻繁に発生するシナリオでは、増分更新を使用して更新効率を向上させることができます。増分更新マテリアライズドビューを作成する前に、マテリアライズドビューのベーステーブルに基づいてマテリアライズドビューのログ(Mlog)を作成する必要があります。これにより、増分更新マテリアライズドビューを正常に作成できます。
説明
OceanBaseデータベースはマテリアライズドビューのログの自動管理機能をサポートしています。Mlogの自動管理を有効にすると、増分更新マテリアライズドビューを作成する前に、ユーザーがベーステーブルのMlogを作成する必要はありません。OceanBaseデータベースは、対応するMlogを自動的に作成するか、既存のMlogテーブル定義を更新して、新しく作成されたマテリアライズドビューが依存する列を含めます。詳細については、マテリアライズドビューのログの自動管理(MySQLモード)およびマテリアライズドビューのログの自動管理(Oracleモード)を参照してください。
マテリアライズドビューのログの詳細については、MySQLモードのマテリアライズドビューのログおよびOracleモードのマテリアライズドビューのログを参照してください。
次に、増分更新マテリアライズドビューがサポートする3つのクエリシナリオの例を示します:
単一テーブルの集計
salesテーブルにマテリアライズドビューのログを作成します。CREATE MATERIALIZED VIEW LOG ON sales WITH PRIMARY KEY (item_id, item_count, region) INCLUDING NEW VALUES;単一テーブル集計の増分更新マテリアライズドビュー
mv_sales_summary_fastを作成します。CREATE MATERIALIZED VIEW mv_sales_summary_fast REFRESH FAST START WITH sysdate() NEXT sysdate() + interval 1 hour AS SELECT item_id, region, SUM(item_count) AS total_count, count(*) as c, count(item_count) as count FROM sales GROUP BY item_id, region;
複数テーブルの結合
salesテーブルにマテリアライズドビューのログを作成します。(オプション)
salesテーブルのマテリアライズドビューのログを削除します。salesテーブルにマテリアライズドビューのログを作成したことがない場合は、この手順をスキップしてください。DROP MATERIALIZED VIEW LOG ON sales;salesテーブルにマテリアライズドビューのログを作成します。CREATE MATERIALIZED VIEW LOG ON sales WITH PRIMARY KEY (user_id, item_id, item_count, region) INCLUDING NEW VALUES;
itemsテーブルにマテリアライズドビューのログを作成します。CREATE MATERIALIZED VIEW LOG ON items WITH PRIMARY KEY (price_per_item, pic_url) INCLUDING NEW VALUES;複数テーブル結合の増分更新マテリアライズドビュー
mv_sales_items_joinを作成します。CREATE MATERIALIZED VIEW mv_sales_items_join PARTITION BY HASH(order_id) PARTITIONS 10 REFRESH FAST START WITH sysdate() NEXT sysdate() + interval 1 hour AS SELECT s.order_id AS order_id, s.user_id AS customer_id, s.item_id AS item_id, s.item_count AS quantity, s.region AS region, i.order_id AS i_id, i.product_id AS i_item_id, i.price_per_item AS price_per_item, i.pic_url AS pic_url FROM sales s JOIN items i ON s.order_id = i.order_id;
複数テーブルの結合と集計
salesテーブルにマテリアライズドビューのログを作成します。(オプション)
salesテーブルのマテリアライズドビューのログを削除します。salesテーブルにマテリアライズドビューのログを作成したことがない場合は、この手順をスキップしてください。DROP MATERIALIZED VIEW LOG ON sales;salesテーブルにマテリアライズドビューのログを作成します。CREATE MATERIALIZED VIEW LOG ON sales WITH PRIMARY KEY (item_id, item_count, region) INCLUDING NEW VALUES;
itemsテーブルにマテリアライズドビューのログを作成します。(オプション)
itemsテーブルのマテリアライズドビューのログを削除します。itemsテーブルにマテリアライズドビューのログを作成したことがない場合は、この手順をスキップしてください。DROP MATERIALIZED VIEW LOG ON items;itemsテーブルにマテリアライズドビューのログを作成します。CREATE MATERIALIZED VIEW LOG ON items WITH PRIMARY KEY (price_per_item) INCLUDING NEW VALUES;
複数テーブルを結合・集計する、増分更新マテリアライズドビュー
mv_sales_item_join_groupを作成します。CREATE MATERIALIZED VIEW mv_sales_item_join_group REFRESH FAST START WITH sysdate() NEXT sysdate() + interval 1 hour AS SELECT s.item_id AS item_id, s.region AS region, SUM(s.item_count * i.price_per_item) AS sum_price, count(*) AS c, count(s.item_count * i.price_per_item) AS count FROM sales s JOIN items i ON s.order_id = i.order_id GROUP BY item_id, region;
リアルタイムマテリアライズドビューの作成
リアルタイムマテリアライズドビューは、データが変更された際にマテリアライズドビューのクエリ結果がベーステーブルと同期されることを保証します。リアルタイムマテリアライズドビューはマテリアライズドビューのログに依存しているため、増分更新マテリアライズドビューと同様に、マテリアライズドビューを作成する前にマテリアライズドビューのログを作成する必要があります。
説明
OceanBaseデータベースはマテリアライズドビューのログの自動管理機能をサポートしています。mlogの自動管理を有効にすると、リアルタイムマテリアライズドビューを作成する前に、ユーザーはベーステーブルのmlogを作成する必要がなく、OceanBaseデータベースが対応するmlogを自動的に作成するか、既存のmlogテーブル定義を更新して、新しく作成されるマテリアライズドビューが依存する列を含めます。詳細については、マテリアライズドビューのログの自動管理(MySQLモード)およびマテリアライズドビューのログの自動管理(Oracleモード)を参照してください。
salesテーブルにマテリアライズドビューのログを作成します。(オプション)
salesテーブルのマテリアライズドビューのログを削除します。salesテーブルにマテリアライズドビューのログが作成されていない場合は、この手順をスキップしてください。DROP MATERIALIZED VIEW LOG ON sales;salesテーブルにマテリアライズドビューのログを作成します。CREATE MATERIALIZED VIEW LOG ON sales WITH PRIMARY KEY (item_id, item_count, region) INCLUDING NEW VALUES;
リアルタイムマテリアライズドビュー
mv_sales_summary_comを作成します。CREATE MATERIALIZED VIEW mv_sales_summary_com REFRESH FORCE START WITH sysdate() NEXT sysdate() + interval 1 hour ENABLE ON QUERY COMPUTATION AS SELECT item_id, region, SUM(item_count) AS total_count, count(*) as c, count(item_count) as count FROM sales GROUP BY item_id, region;
この例では、ENABLE ON QUERY COMPUTATIONを有効にしています。これにより、マテリアライズドビューはクエリ時にリアルタイムで更新され、最新のデータを取得できるようになります。また、マテリアライズドビューのクエリステートメントは、増分更新マテリアライズドビューの作成要件を満たしています。
ネストマテリアライズドビューの作成
ETLプロセスにおいて、ネストマテリアライズドビューは、複数のマテリアライズドビューを組み合わせて、より複雑なデータ処理フローを構築するために使用されます。ここでは、2つのマテリアライズドビューを作成します。1つは販売情報と商品情報を関連付けるもので、もう1つは最初のマテリアライズドビューに基づいてさらに集計を行います。
salesテーブルにマテリアライズドビューのログを作成します。(オプション)
salesテーブルのマテリアライズドビューのログを削除します。salesテーブルにマテリアライズドビューのログを作成したことがない場合は、この手順をスキップしてください。DROP MATERIALIZED VIEW LOG ON sales;salesテーブルにマテリアライズドビューのログを作成します。CREATE MATERIALIZED VIEW LOG ON sales WITH PRIMARY KEY (user_id, item_id, item_count, region) INCLUDING NEW VALUES;
itemsテーブルにマテリアライズドビューのログを作成します。(オプション)
itemsテーブルのマテリアライズドビューのログを削除します。itemsテーブルにマテリアライズドビューのログを作成したことがない場合は、この手順をスキップしてください。DROP MATERIALIZED VIEW LOG ON items;itemsテーブルにマテリアライズドビューのログを作成します。CREATE MATERIALIZED VIEW LOG ON items WITH PRIMARY KEY (price_per_item,pic_url) INCLUDING NEW VALUES;
販売情報と商品情報を関連付けるマテリアライズドビュー
mv1_sales_items_joinを作成します。CREATE MATERIALIZED VIEW mv1_sales_items_join REFRESH FAST START WITH sysdate() NEXT sysdate() + interval 1 hour AS SELECT s.order_id AS order_id, s.user_id AS customer_id, s.item_id AS item_id, s.item_count AS quantity, s.region AS region, i.order_id AS i_id, i.product_id AS i_item_id, i.price_per_item AS price_per_item, i.pic_url FROM sales s JOIN items i ON s.order_id = i.order_id;マテリアライズドビュー
mv1_sales_items_joinにマテリアライズドビューのログを作成します。CREATE MATERIALIZED VIEW LOG ON mv1_sales_items_join WITH PRIMARY KEY (region,quantity,price_per_item) INCLUDING NEW VALUES;マテリアライズドビュー
mv1_sales_items_joinに基づいてマテリアライズドビューmv2_join_sumを作成します。CREATE MATERIALIZED VIEW mv2_join_sum REFRESH FAST START WITH sysdate() NEXT sysdate() + interval 1 hour AS SELECT region, sum(quantity * price_per_item) AS sum_price, count(*) as c, count(quantity * price_per_item) as count FROM mv1_sales_items_join GROUP BY region;
カラムストアマテリアライズドビューの作成
大規模データ分析シナリオでクエリ効率を向上させたい場合、カラムストアマテリアライズドビューを作成できます。列ストア形式により、クエリ時に必要な列のみを読み取ることができ、ディスクI/Oを大幅に削減します。
salesテーブルにマテリアライズドビューのログを作成します。(オプション)
salesテーブルのマテリアライズドビューのログを削除します。salesテーブルにマテリアライズドビューのログを作成したことがない場合は、この手順をスキップしてください。DROP MATERIALIZED VIEW LOG ON sales;salesテーブルにマテリアライズドビューのログを作成します。CREATE MATERIALIZED VIEW LOG ON sales WITH PRIMARY KEY (user_id, item_id, item_count, region) INCLUDING NEW VALUES;
itemsテーブルにマテリアライズドビューのログを作成します。(オプション)
itemsテーブルのマテリアライズドビューのログを削除します。itemsテーブルにマテリアライズドビューのログを作成したことがない場合は、この手順をスキップしてください。DROP MATERIALIZED VIEW LOG ON items;itemsテーブルにマテリアライズドビューのログを作成します。CREATE MATERIALIZED VIEW LOG ON items WITH PRIMARY KEY (price_per_item,pic_url) INCLUDING NEW VALUES;
カラムストアマテリアライズドビュー
wide_sales_columnを作成します。CREATE MATERIALIZED VIEW wide_sales_column WITH COLUMN GROUP(each column) REFRESH FAST START WITH sysdate() NEXT sysdate() + interval 1 hour AS SELECT s.order_id AS order_id, s.user_id AS customer_id, s.item_id AS item_id, s.item_count AS quantity, s.region AS region, i.order_id AS i_id, i.product_id AS i_item_id, i.price_per_item AS price_per_item, i.pic_url FROM sales s JOIN items i ON s.order_id = i.order_id;
このカラムストアマテリアライズドビュー作成の例では、WITH COLUMN GROUP(each column) を指定しており、これによりマテリアライズドビューは列ストア形式を使用します。これはOLAPシナリオ、特に大規模データやワイドテーブルのクエリにおいて非常に有効です。
クエリのリライトが可能なマテリアライズドビューの作成
この例では、ENABLE QUERY REWRITE を指定して、クエリのリライトが可能なフル更新マテリアライズドビューを作成します。
CREATE MATERIALIZED VIEW mv_sales_summary_select
REFRESH COMPLETE
START WITH sysdate()
NEXT sysdate() + interval 1 hour
ENABLE QUERY REWRITE
AS SELECT item_id, region, SUM(item_count) AS total_count
FROM sales
GROUP BY item_id, region;
この例では、ENABLE QUERY REWRITE および ENABLE ON QUERY COMPUTATION を指定して、クエリのリライトが可能なリアルタイムマテリアライズドビューを作成します。
salesテーブルにマテリアライズドビューのログを作成します。(オプション)
salesテーブルのマテリアライズドビューのログを削除します。salesテーブルにマテリアライズドビューのログを作成したことがない場合は、この手順をスキップしてください。DROP MATERIALIZED VIEW LOG ON sales;salesテーブルにマテリアライズドビューのログを作成します。CREATE MATERIALIZED VIEW LOG ON sales WITH PRIMARY KEY (item_id, item_count, region) INCLUDING NEW VALUES;
クエリのリライトが可能なリアルタイムマテリアライズドビュー
mv_sales_summary_com_selectを作成します。CREATE MATERIALIZED VIEW mv_sales_summary_com_select REFRESH FAST START WITH sysdate() NEXT sysdate() + interval 1 hour ENABLE ON QUERY COMPUTATION ENABLE QUERY REWRITE AS SELECT item_id, region, SUM(item_count) AS total_sales, count(*) as c, count(item_count) as count FROM sales GROUP BY item_id, region;
マテリアライズドビューインデックスの作成
クエリパフォーマンスをさらに最適化するために、マテリアライズドビューにインデックスを作成できます。マテリアライズドビューインデックスは、特に大量のデータが関わる場合、マテリアライズドビューに対するクエリの高速化に役立ちます。
(オプション)製品と地域ごとに販売量を集計したマテリアライズドビュー
mv_sales_summaryを作成します。フル更新マテリアライズドビューの作成 の例に従ってマテリアライズドビュー
mv_sales_summaryを既に作成している場合は、この手順をスキップしてください。CREATE MATERIALIZED VIEW mv_sales_summary(PRIMARY KEY(item_id)) REFRESH COMPLETE START WITH sysdate() NEXT sysdate() + interval 1 hour AS SELECT item_id, region, SUM(item_count) AS total_count FROM sales GROUP BY item_id, region;マテリアライズドビュー
mv_sales_summaryのregion列にインデックスidx_mv_sales_summaryを作成します。CREATE INDEX idx_mv_sales_summary ON mv_sales_summary (region);このインデックスは、特に
region列に基づくクエリにおいて、マテリアライズドビューmv_sales_summary上のクエリを高速化します。
データディクショナリと運用保守ビュー
マテリアライズドビュー、Mログ、リフレッシュタスクのトラブルシューティング時によく使用されるシステムビューは以下の通りです(MySQLモードを例とします。完全なリストとフィールド説明は、現在のバージョンのリファレンスドキュメントをご確認ください)。
DBAビュー |
ALLビュー |
USERビュー |
機能 |
|---|---|---|---|
DBA_MVIEW_LOGS |
ALL_MVIEW_LOGS |
USER_MVIEW_LOGS |
マテリアライズドビューのログ情報を記述する |
DBA_MVIEWS |
ALL_MVIEWS |
USER_MVIEWS |
マテリアライズドビュー情報を記述する |
DBA_MVREF_STATS_SYS_DEFAULTS |
USER_MVREF_STATS_SYS_DEFAULTS |
マテリアライズドビューのリフレッシュ履歴統計プロパティのシステム範囲デフォルト値を記述する | |
DBA_MVREF_STATS_PARAMS |
USER_MVREF_STATS_PARAMS |
各マテリアライズドビューに関連付けられたリフレッシュ統計情報プロパティを記述する | |
DBA_MVREF_RUN_STATS |
USER_MVREF_RUN_STATS |
マテリアライズドビューの各リフレッシュ実行情報を記述する。各実行は REFRESH_ID で識別される |
|
DBA_MVREF_STATS |
USER_MVREF_STATS |
マテリアライズドビューのリフレッシュに関する基本的な時間統計情報を記述する | |
DBA_MVREF_CHANGE_STATS |
USER_MVREF_CHANGE_STATS |
すべてのマテリアライズドビューのリフレッシュ実行に関連付けられたベーステーブル上の変更データロード情報を記述する | |
DBA_MVREF_STMT_STATS |
USER_MVREF_STMT_STATS |
リフレッシュステートメントに関連付けられた情報を記述する |
関連ドキュメント
- マテリアライズドビューの詳細および使用方法については、マテリアライズドビューの概要(MySQLモード)およびマテリアライズドビューの概要(Oracleモード)を参照してください。
- マテリアライズドビューのリフレッシュに関する詳細および使用方法については、マテリアライズドビューのリフレッシュ(MySQLモード)およびマテリアライズドビューのリフレッシュ(Oracleモード)を参照してください。
- マテリアライズドビューのログに関する詳細および使用方法については、マテリアライズドビューのログ(MySQLモード)およびマテリアライズドビューのログ(Oracleモード)を参照してください。
- マテリアライズドビューの削除に関する詳細および使用方法については、マテリアライズドビューの削除(MySQLモード)およびマテリアライズドビューの削除(Oracleモード)を参照してください。