マテリアライズドビュー
マテリアライズドビューは、クエリ結果を物理的に保存するビューです。これは、default catalog 内の 1 つの永続的な FUSE テーブル上に定義されます。TiDB Cloud Lake は、マテリアライズドビューの作成時にソーステーブルの変更追跡を有効にします。
論理ビューとは異なり、マテリアライズドビューは明示的にリフレッシュして、ソーステーブルからの変更を永続化できます。物理ストレージがソーステーブルに遅れている場合でも、読み取りの一貫性は保たれます。最初のリフレッシュの前に、TiDB Cloud Lake はソースに対して定義を評価します。リフレッシュされていないソース変更がある場合、TiDB Cloud Lake は read fix を使用します。つまり、読み取り時に永続化されたマテリアライズドビューのデータと必要な増分ソースデータを合わせ(その増分にもビュー定義を適用し)、結果を返します。そのため、クエリは古いマテリアライズドデータではなく、最新の結果を返します。
制限事項
- 定義は、厳密に 1 つのベーステーブルに対する単純な
SELECT ... FROM ... [WHERE ...] [GROUP BY ...]クエリである必要があります。結合、サブクエリ、集合演算、および非決定的関数はサポートされていません。 - 集計は
sum、min、max、avg、count、approx_count_distinctのみサポートされます。DISTINCT、FILTER、ウィンドウ、および順序付き集計の形式はサポートされていません。 - ソースは、
defaultcatalog 内の永続的な FUSE ベーステーブルである必要があります。マテリアライズドビューは、別のビューや異なるテーブルエンジンをソースとして使用できません。 - マテリアライズドビューは読み取り専用です。内容を管理するには
REFRESH MATERIALIZED VIEWを使用します。INSERT、UPDATE、DELETE、TRUNCATE、および通常のALTER TABLE操作はサポートされていません。
マテリアライズドビューを作成する
CREATE [ OR REPLACE ] MATERIALIZED VIEW [ IF NOT EXISTS ]
[ <catalog_name>. ][ <database_name>. ]<view_name>
[ ( <column_name>, ... ) ]
[ CLUSTER BY ( <expr>, ... ) ]
[ COMMENT = '<comment>' ]
[ <fuse_table_option> = <value> ... ]
AS <query>
CLUSTER BY では明示的なカラムリストが必要で、非集計の出力カラムまたは GROUP BY キーを参照できます。オプションの Fuse テーブルオプションは物理ストレージレイアウトを制御します。サポートされるオプションについては、CREATE TABLE を参照してください。
作成時には定義が記録されますが、物理ストレージは同期的には投入されません。初期データをマテリアライズするには、REFRESH MATERIALIZED VIEW を実行してください。
CREATE TABLE orders (
order_id INT,
customer_id INT,
amount DECIMAL(10, 2),
paid BOOLEAN
);
CREATE MATERIALIZED VIEW paid_orders_by_customer
(customer_id, total_amount, order_count)
CLUSTER BY (customer_id)
COMMENT = 'Paid-order totals by customer'
AS
SELECT customer_id, sum(amount), count(*)
FROM orders
WHERE paid
GROUP BY customer_id;
REFRESH MATERIALIZED VIEW paid_orders_by_customer;
CREATE OR REPLACE は既存のマテリアライズドビューを置き換えます。IF NOT EXISTS は、名前がすでに存在する場合は何も行いません。
マテリアライズドビューをリフレッシュする
REFRESH MATERIALIZED VIEW [ <catalog_name>. ][ <database_name>. ]<view_name>
最初のリフレッシュではソースデータがマテリアライズされます。以降のリフレッシュでは、append-only の変更が増分的に処理されます。ソースに UPDATE、DELETE、または TRUNCATE の変更がある場合、TiDB Cloud Lake は現在のソース状態からマテリアライズドビューを再構築し、結果の正しさを保ちます。
物理レイアウトを変更する
サポートされる管理操作には、専用の ALTER MATERIALIZED VIEW 構文を使用します。
ALTER MATERIALIZED VIEW <view_name> CLUSTER BY ( <expr>, ... );
ALTER MATERIALIZED VIEW <view_name> DROP CLUSTER KEY;
ALTER MATERIALIZED VIEW <view_name> RECLUSTER [ FINAL ] [ LIMIT <n> ];
ALTER MATERIALIZED VIEW <view_name> SET OPTIONS ( <option> = <value>, ... );
ALTER MATERIALIZED VIEW <view_name> UNSET OPTIONS ( <option>, ... );
ALTER MATERIALIZED VIEW <view_name> COMMENT = '<comment>';
たとえば、リフレッシュの前にレイアウトオプションを設定できます。
ALTER MATERIALIZED VIEW paid_orders_by_customer SET OPTIONS (row_per_block = 2);
REFRESH MATERIALIZED VIEW paid_orders_by_customer;
マテリアライズドビューでは RECLUSTER WHERE はサポートされていません。定義を変更するには CREATE OR REPLACE MATERIALIZED VIEW を使用してください。ALTER VIEW は適用されません。
定義を表示および削除する
SHOW MATERIALIZED VIEWS
[ { FROM | IN } <database_name> ]
[ LIKE '<pattern>' | WHERE <expr> ];
SHOW CREATE MATERIALIZED VIEW
[ <catalog_name>. ][ <database_name>. ]<view_name>;
DROP MATERIALIZED VIEW [ IF EXISTS ]
[ <catalog_name>. ][ <database_name>. ]<view_name>;
SHOW MATERIALIZED VIEWS LIKE 'paid_orders%';
SHOW CREATE MATERIALIZED VIEW paid_orders_by_customer;
DROP MATERIALIZED VIEW IF EXISTS paid_orders_by_customer;
アクセス制御要件
マテリアライズドビューのクエリ、リフレッシュ、変更、表示、または削除を行うには、ユーザーはそのソーステーブルに対する SELECT 権限(または同等のアクセスを提供する所有権)を持っている必要があります。権限は現在のソーステーブル ID に対してチェックされるため、ソーステーブルの名前を変更してもこの要件は変わりません。