マテリアライズドビューはクエリ結果を物理ストレージ上に保存するため、読み取り時に計算を一切スキップし、事前に構築されたデータを返します。一方、通常のビューはアクセスされるたびにクエリを再実行しますが、マテリアライズドビューは「新鮮さ」を「速度」と引き換えます。つまり、データは自動的に更新されず、手動でリフレッシュする必要があります。定期的なリフレッシュが許容される場合、マテリアライズドビューはベーステーブルや通常のビューを直接クエリする場合と比較して、著しいクエリパフォーマンス向上を実現します。
マテリアライズドビューを使用するタイミング
以下のすべての条件が満たされる場合に、マテリアライズドビューをご使用ください。
クエリの実行コストが高い(複雑な結合、集約、またはクロスシステム参照など)。
結果の読み取り頻度が、基盤となるデータの変更頻度よりもはるかに高い。
ご使用のユースケースにおいて、わずかに古いデータでも問題ない。
以下のいずれかに該当する場合は、通常のビューを使用するか、ベーステーブルを直接クエリしてください。
基盤となるデータが頻繁に変更され、読み取り側が常に最新の値を必要とする。
クエリが軽量であり、再実行によるオーバーヘッドが実質的に発生しない。
適用範囲/利用シーン
変更頻度の低い集約処理:過去の販売実績や利用メトリックをマテリアライズドビューに集約し、毎晩リフレッシュします。ダッシュボードでは、生のテーブルをスキャンする代わりにこのビューをクエリします。
複雑な反復クエリ:複数のアプリケーションが繰り返し実行する高コストの結合やウィンドウ関数を事前計算します。
外部データの高速化:Object Storage Service (OSS) の外部テーブルや MaxCompute 上にマテリアライズドビューを作成し、外部データをローカル記憶域にプルします。その後、ビューに対してインデックスを作成することで、高速な検索を実現します。
マテリアライズドビューの作成
例: people テーブルを people から age > 40 の行にフィルターし、id で分散されるマテリアライズドビューを作成します。
CREATE MATERIALIZED VIEW my_materialized_view AS
SELECT * FROM people WHERE age > 40
DISTRIBUTED BY (id);
SELECT * FROM my_materialized_view ORDER BY age;結果:
id | name | city | age
-----------+--------+----------+-----
004 | zhaoyi | zhenzhou | 44
005 | xuliui | jiaxing | 54
006 | maodi | shanghai | 55
(3 rows)CREATE MATERIALIZED VIEW 文で定義されたクエリは、ビューの初期データ投入時のみ使用されます。マテリアライズドビューとテーブルとの構造上の唯一の違いは、オブジェクト識別子(OID)が自動生成されない点です。
DISTRIBUTED BY 句は省略可能です。省略した場合、最初の列が分散キーとして使用されます。
定義クエリに ORDER BY 句または SORT 句が含まれている場合、マテリアライズドビュー内のデータは実際にその順序で格納されないことがあります。
マテリアライズドビューのリフレッシュ
構文:
REFRESH MATERIALIZED VIEW view_name
[ WITH [ NO ] DATA ]ベーステーブルが変更されても、マテリアライズドビューのデータは自動的に更新されません。REFRESH MATERIALIZED VIEW コマンドを実行して、最新のデータを取得してください。
例:新しい行を挿入し、ビューが依然として古いデータを返すことを確認した後、リフレッシュを実行します。
INSERT INTO people VALUES('007','sunshen','shenzhen',60);
-- リフレッシュ前のデータが表示されたまま
SELECT * FROM my_materialized_view ORDER BY age;結果:
id | name | city | age
-----------+--------+----------+-----
004 | zhaoyi | zhenzhou | 44
005 | xuliui | jiaxing | 54
006 | maodi | shanghai | 55
(3 rows)REFRESH MATERIALIZED VIEW my_materialized_view;
SELECT * FROM my_materialized_view ORDER BY age;リフレッシュ後の結果:
id | name | city | age
-----------+---------+----------+-----
004 | zhaoyi | zhenzhou | 44
005 | xuliui | jiaxing | 54
006 | maodi | shanghai | 55
007 | sunshen | shenzhen | 60
(4 rows)NO DATA オプションによるマテリアライズドビューの無効化
WITH NO DATA を指定すると、ビューの内容が空になり、スキャン不可状態としてマークされます。この状態でビューに対するクエリを実行すると、完全リフレッシュを実行するまでエラーが返されます。
REFRESH MATERIALIZED VIEW my_materialized_view WITH NO DATA;
SELECT * FROM my_materialized_view ORDER BY age;
-- ERROR: materialized view "my_materialized_view" has not been populated
-- HINT: Use the REFRESH MATERIALIZED VIEW command.
REFRESH MATERIALIZED VIEW my_materialized_view;
SELECT * FROM my_materialized_view ORDER BY age;再投入後の結果:
id | name | city | age
-----------+---------+----------+-----
004 | zhaoyi | zhenzhou | 44
005 | xuliui | jiaxing | 54
006 | maodi | shanghai | 55
007 | sunshen | shenzhen | 60
(4 rows)マテリアライズドビューの削除
構文:
DROP MATERIALIZED VIEW view_name [ CASCADE ]例:独立したマテリアライズドビューを削除します。
CREATE MATERIALIZED VIEW depend_materialized_view AS
SELECT * FROM my_materialized_view WHERE age > 50
DISTRIBUTED BY (id);
DROP MATERIALIZED VIEW depend_materialized_view;依存オブジェクトを持つマテリアライズドビューの削除
削除対象のマテリアライズドビューに他のマテリアライズドビューが依存している場合、CASCADE オプションを指定する必要があります。指定しないと、AnalyticDB は依存オブジェクトの一覧を含むエラーを返します。
-- このコマンドは失敗します(depend_materialized_view が my_materialized_view に依存しているため)
DROP MATERIALIZED VIEW my_materialized_view;
-- ERROR: cannot drop materialized view my_materialized_view because other objects depend on it
-- DETAIL: materialized view depend_materialized_view depends on materialized view my_materialized_view
-- HINT: Use DROP ... CASCADE to drop the dependent objects too.
-- CASCADE を指定すると、my_materialized_view と depend_materialized_view を一括で削除します
DROP MATERIALIZED VIEW my_materialized_view CASCADE;CASCADE は、すべての依存マテリアライズドビューを永続的に削除します。このコマンドを実行する前に、依存関係チェーンを必ず確認してください。
注意事項
| トピック | 詳細 |
|---|---|
| 手動リフレッシュのみ | AnalyticDB for PostgreSQL では、マテリアライズドビューの自動更新はサポートされていません。REFRESH MATERIALIZED VIEW コマンドを実行して、最新のデータを取得してください。 |
| 読み取り専用 | マテリアライズドビューには、直接書き込み(INSERT、UPDATE、DELETE)はサポートされていません。ベーステーブルを変更した後、ビューをリフレッシュしてください。 |
| インデックス | マテリアライズドビューに対しても、通常のテーブルと同様にインデックスを作成できます。これにより、ビューに対するクエリのパフォーマンスをさらに向上させられます。 |