物化視圖(Materialized View)是一種預先計算的方式,通過儲存某些耗時操作(例如JOIN、AGGREGATE)的結果,以便在查詢時直接複用,從而避免重複執行這些耗時操作,最終實現加速查詢的目的。
背景資訊
視圖是一種虛擬表,任何對視圖的查詢,都會轉換為視圖SQL語句的查詢。而物化視圖是一種特殊的物理表,物化視圖會儲存實際的資料,佔用儲存資源。更多物化視圖計費資訊,請參見計費規則。
物化視圖適用於如下情境:
模式固定、且執行頻次高的查詢。
查詢包含非常耗時的操作,比如彙總、串連操作等。
查詢僅涉及表中的很小部分資料。
物化視圖與傳統查詢的對比如下。
對比項 | 傳統查詢方式 | 物化視圖查詢方式 |
查詢語句 | 直接使用SQL語句查詢資料。
| 您需要建立物化視圖,然後基於物化視圖查詢資料。 建立物化視圖語句如下:
基於建立的物化視圖查詢資料:
如果物化視圖開啟了查詢改寫功能,使用如下SQL語句查詢資料時會直接從物化視圖中查詢資料:
|
查詢特點 | 查詢涉及讀表、JOIN、過濾(WHERE)操作。當源表資料量很大時,查詢速度會很慢。操作複雜度較高,運行效率低。 | 查詢涉及讀表、過濾操作。不涉及JOIN操作。MaxCompute會自動匹配到最優物化視圖,並直接從物化視圖中讀取資料,從而大大提高查詢效率。 |
操作命令
類型 | 功能 | 角色 | 操作入口 |
基於查詢語句建立物化視圖。 | 具備專案建立表許可權(CreateTable)的使用者。 | 本文中的命令您可以在如下工具平台執行: | |
更新已建立的物化視圖。 | 具備修改表許可權(Alter)的使用者。 | ||
修改已建立的物化視圖的生命週期。 | 具備修改表許可權(Alter)的使用者。 | ||
開啟或禁用已建立的物化視圖的生命週期。 | 具備修改表許可權(Alter)的使用者。 | ||
查詢物化視圖的基本資料。 | 具備讀取表元資訊許可權(Describe)的使用者。 | ||
查看物化視圖有效或無效。 | 具備讀取表元資訊許可權(Describe)的使用者。 | ||
列出專案下所有的物化視圖,或符合某些規則的物化視圖。 | 具備專案查看對象列表許可權(List)的使用者。 | ||
刪除已建立的物化視圖。 | 具備刪除表許可權(Drop)的使用者。 | ||
刪除已建立的物化視圖的分區。 | 具備刪除表許可權(Drop)的使用者。 | ||
當查詢的分區資料不存在時,需要自動實現到原始分區表查詢資料。 | 具備專案寫入權限(Write)及建立表許可權(CreateTable)的使用者。 | ||
對查詢語句進行查詢改寫。 | 具備專案寫入權限(Write)及建立表許可權(CreateTable)的使用者。 | ||
定時更新已建立物化視圖的資料。 | 具備修改表許可權(Alter)的使用者。 |
使用限制
物化視圖的使用限制如下:
不支援視窗函數。
不支援UDTF函數。
預設不支援非確定性函數(例如UDF、UDAF等)。當您的業務情境必須要使用非確定性函數時,請在Session層級設定屬性
set odps.sql.materialized.view.support.nondeterministic.function=true;
。
建立物化視圖(支援分區和聚簇)
基於滿足物化視圖情境的資料建立物化視圖,支援分區和聚簇情境。
使用限制
物化視圖的名稱不允許和當前專案中的已有表、視圖、物化視圖名稱重複。您可以通過
SHOW TABLES;
命令查看專案中的全部表及物化視圖名稱。不支援基於存在的物化視圖建立新的物化視圖。
不支援基於外部表格建立物化視圖。
注意事項
當查詢語句執行失敗時,物化視圖也會建立失敗。
物化視圖分區列必須來源於某張源表,其順序和列數目必須和源表一樣,列名稱可以不一樣。
列注釋需要指定所有列,包含分區列。如果只指定部分列,會報錯。
可以同時指定分區和聚簇,此時每個分區中的資料都有指定的聚簇屬性。
當查詢語句中包含不支援的運算元時會報錯。物化視圖支援的運算元列表,請參見物化視圖查詢改寫操作。
MaxCompute預設不支援使用非確定性函數(例如UDF、UDAF等)建立物化視圖。當您的業務情境必須要使用非確定性函數時,請在Session層級設定屬性
set odps.sql.materialized.view.support.nondeterministic.function=true;
。物化視圖支援產生空分區,原始表分區為空白的時候,重新整理物化視圖,自動產生空分區。
命令格式
CREATE MATERIALIZED VIEW [IF NOT EXISTS][project_name.]<mv_name> [LIFECYCLE <days>] --指定生命週期 [BUILD DEFERRED] -- 指定是在建立時只產生表結構,不產生資料 [(<col_name> [COMMENT <col_comment>],...)] --列注釋 [DISABLE REWRITE] --指定是否用於改寫 [COMMENT 'table comment'] --表注釋 [PARTITIONED BY (<col_name> [, <col_name>, ...]) --建立物化視圖表為分區表 [CLUSTERED BY|RANGE CLUSTERED BY (<col_name> [, <col_name>, ...]) [SORTED BY (<col_name> [ASC | DESC] [, <col_name> [ASC | DESC] ...])] INTO <number_of_buckets> BUCKETS] --用於建立聚簇表時設定表的Shuffle和Sort屬性 [REFRESH EVERY <num> MINUTES/HOURS/DAYS] [TBLPROPERTIES("compressionstrategy"="normal/high/extreme", --指定表資料存放區壓縮策略 "enable_auto_substitute"="true", --指定當分區不存在時是否轉化視圖來查詢 "enable_auto_refresh"="true", --指定是否開啟自動重新整理 "refresh_interval_minutes"="120", --指定重新整理時間間隔 "only_refresh_max_pt"="true" --針對分區物化視圖,只自動重新整理源表最新分區 )] AS <select_statement>;
參數說明
參數
是否必填
說明
IF NOT EXISTS
否
如果沒有指定IF NOT EXISTS且物化視圖已經存在會返回報錯。
project_name
否
物化視圖所屬目標MaxCompute專案名稱。不填寫時表示當前所在MaxCompute專案。您可以登入MaxCompute控制台,左上方切換地區後,即可在專案管理頁面查看到具體的MaxCompute專案名稱。
mv_name
是
建立物化視圖的名稱。
days
否
指定物化視圖的生命週期,單位為天。取值範圍為1~37231。
BUILD DEFERRED
否
如果加上這個關鍵字代表建立物化視圖時,只產生表結構,不重新整理資料。
col_name
否
指定物化視圖的列名稱。
col_comment
否
指定物化視圖的列的注釋。
DISABLE REWRITE
否
設定禁止通過物化視圖執行查詢改寫操作。不指定時表示允許通過物化視圖執行查詢改寫操作,您可以執行
ALTER MATERIALIZED VIEW [project_name.]<mv_name> DISABLE REWRITE;
命令禁止通過物化視圖執行查詢改寫操作。同理您可以執行ALTER MATERIALIZED VIEW [project_name.]<mv_name> ENABLE REWRITE;
命令允許通過物化視圖執行查詢改寫操作。PARTITIONED BY
否
指定物化視圖分區欄位,表示建立的物化視圖表為分區表。
CLUSTERED BY|RANGE CLUSTERED BY
否
用於建立聚簇表時設定表的Shuffle屬性。
SORTED BY
否
用於建立聚簇表時設定表的Sort屬性。
REFRESH EVERY
否
用於設定物化視圖定時更新間隔。單位可選擇:分鐘/小時/天。
number_of_buckets
否
用於建立聚簇表時設定表分桶數。
TBLPROPERTIES
否
compressionstrategy指定表資料的儲存壓縮策略,可以選normal、high或extreme。enable_auto_substitute指定當分區不存在時是否自動穿透到原始分區表去查詢資料,詳細資料請參見物化視圖查詢改寫。
enable_auto_refresh:可選,當需要自動重新整理資料時需要設定為
true
。refresh_interval_minutes:條件可選,當
enable_auto_refresh
為true
時,需要配置重新整理間隔時間,單位為分鐘。only_refresh_max_pt:可選,只適用於帶分區的物化視圖,但設定為
true
時,只會重新整理源表最新分區。
select_statement
是
查詢語句,詳細格式請參見SELECT文法。
使用樣本
樣本一:建立物化視圖。
建立
mf_t
和mf_t1
兩張表並插入資料。CREATE TABLE IF NOT EXISTS mf_t( id bigint, value bigint, name string) PARTITIONED BY (ds STRING); ALTER TABLE mf_t ADD PARTITION (ds='1'); INSERT INTO mf_t PARTITION (ds='1') VALUES (1,10,'kyle'),(2,20,'xia'); SELECT * FROM mf_t WHERE ds ='1'; -- 返回結果如下。 +------------+------------+------------+------------+ | id | value | name | ds | +------------+------------+------------+------------+ | 1 | 10 | kyle | 1 | | 2 | 20 | xia | 1 | +------------+------------+------------+------------+ CREATE TABLE IF NOT EXISTS mf_t1( id bigint, value bigint, name string) PARTITIONED BY (ds STRING); ALTER TABLE mf_t1 ADD PARTITION (ds='1'); INSERT INTO mf_t1 PARTITION (ds='1') VALUES (1,10,'kyle'),(3,20,'john'); SELECT * FROM mf_t1 WHERE ds ='1'; -- 返回結果如下。 +------------+------------+------------+------------+ | id | value | name | ds | +------------+------------+------------+------------+ | 1 | 10 | kyle | 1 | | 3 | 20 | john | 1 | +------------+------------+------------+------------+
建立物化視圖。
樣本1:建立以ds為分區列的物化視圖。
CREATE MATERIALIZED VIEW mf_mv LIFECYCLE 7 ( key comment 'unique id', value comment 'input value', ds comment 'partitiion' ) PARTITIONED BY (ds) AS SELECT t1.id AS key, t1.value AS value, t1.ds AS ds FROM mf_t AS t1 JOIN mf_t1 AS t2 ON t1.id = t2.id AND t1.ds=t2.ds AND t1.ds='1'; --查詢物化視圖 SELECT * FROM mf_mv WHERE ds =1; +------------+------------+------------+ | key | value | ds | +------------+------------+------------+ | 1 | 10 | 1 | +------------+------------+------------+
樣本2:建立帶有聚簇屬性的非分區物化視圖。
CREATE MATERIALIZED VIEW mf_mv2 LIFECYCLE 7 CLUSTERED BY (key) SORTED BY (value) INTO 1024 buckets AS SELECT t1.id AS key, t1.value AS value, t1.ds AS ds FROM mf_t AS t1 JOIN mf_t1 AS t2 ON t1.id = t2.id AND t1.ds=t2.ds AND t1.ds='1';
樣本3:建立帶有聚簇屬性的分區物化視圖。
CREATE MATERIALIZED VIEW mf_mv3 LIFECYCLE 7 PARTITIONED BY (ds) CLUSTERED BY (key) SORTED BY (value) INTO 1024 buckets AS SELECT t1.id AS key, t1.value AS value, t1.ds AS ds FROM mf_t AS t1 JOIN mf_t1 AS t2 ON t1.id = t2.id AND t1.ds=t2.ds AND t1.ds='1';
樣本二:原始表分區為空白的時候,重新整理物化視圖,自動產生空分區。
CREATE TABLE mf_blank_pts(id bigint ,name string) PARTITIONED BY (ds bigint); ALTER TABLE mf_blank_pts ADD PARTITION (ds = 1); ALTER TABLE mf_blank_pts ADD PARTITION (ds = 2); INSERT INTO TABLE mf_blank_pts PARTITION(ds=1) VALUES (1,"aba"),(2,"cbd"); CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_blank_pts PARTITIONED BY (ds) AS SELECT id,name,ds FROM mf_blank_pts; ALTER MATERIALIZED VIEW mf_mv_blank_pts REBUILD PARTITION (ds>0); SHOW PARTITIONS mf_mv_blank_pts; --原表分區ds=2是沒有值,當重新整理ds>0分區時,物化視圖裡有了空分區 ds=1 ds=2 SELECT * FROM mf_mv_blank_pts WHERE ds>0; --返回只有分區1有值 +------------+------------+------------+ | id | name | ds | +------------+------------+------------+ | 1 | aba | 1 | | 2 | cbd | 1 | +------------+------------+------------+
更新物化視圖
當物化視圖的資料對應的表或分區產生插入、覆寫、更新、刪除等操作時,物化視圖會自動失效,無法用於查詢改寫。您可以先查看物化檢視狀態,當物化視圖失效時,執行更新操作。查看物化檢視狀態操作,請參見查詢物化視圖資訊。
注意事項
物化視圖的更新操作只會更新源表有資料變化的表或者分區。
您可以開啟物化視圖定時更新功能來定時更新資料。詳情請參見物化視圖定時更新。
命令格式
ALTER MATERIALIZED VIEW [<project_name>.]<mv_name> REBUILD [PARTITION (<ds>=max_pt(<table_name>),<expression1>...)];
參數說明
參數
是否必填
說明
project_name
否
物化視圖所屬目標MaxCompute專案名稱。不填寫時表示當前所在MaxCompute專案。您可以登入MaxCompute控制台,左上方切換地區後,即可在專案管理頁簽查看到具體的MaxCompute專案名稱。
mv_name
是
待更新物化視圖的名稱。
ds
否
物化視圖分區欄位名稱。
max_pt
否
取指定表或者物化視圖(table_name)的最大分區值。
expression
否
當更新分區物化視圖時,需要指定待更新分區資訊,支援運算式。
使用樣本
樣本一:更新非分區物化視圖。
-- 建立非分區表 CREATE TABLE count_test(a BIGINT, b BIGINT); --建立非分區物化視圖 CREATE MATERIALIZED VIEW count_mv LIFECYCLE 7 AS SELECT COUNT(*) FROM count_test; --更新非分區物化視圖 ALTER MATERIALIZED VIEW count_mv rebuild;
樣本二:更新分區物化視圖的某個分區。
ALTER MATERIALIZED VIEW mf_mv_blank_pts REBUILD PARTITION (ds='1');
樣本三:更新分區物化視圖的滿足指定條件的分區。
ALTER MATERIALIZED VIEW mf_mv_blank_pts REBUILD PARTITION (ds>='1', ds<='2');
樣本四:更新分區物化視圖的最新分區資料。
-- 建立樣本分區表 CREATE TABLE IF NOT EXISTS sale_detail_jt (shop_name STRING , customer_id STRING , total_price DOUBLE ) PARTITIONED BY (sale_date STRING ,region STRING ); ALTER TABLE sale_detail_jt ADD PARTITION (sale_date='2013',region='china'); INSERT INTO sale_detail_jt PARTITION (sale_date='2013',region='china') VALUES ('s1','c1',100.1), ('s2','c2',100.2), ('s3','c3',100.3); ALTER TABLE sale_detail_jt ADD PARTITION (sale_date='2013',region='en'); INSERT INTO sale_detail_jt PARTITION (sale_date='2013',region='en') VALUES ('t1','c5',200.0), ('t2','c6',300.0); --查看分區資料 SELECT * FROM sale_detail_jt WHERE sale_date='2013' AND region='china'; +-----------+-------------+-------------+-----------+--------+ | shop_name | customer_id | total_price | sale_date | region | +-----------+-------------+-------------+-----------+--------+ | s1 | c1 | 100.1 | 2013 | china | | s2 | c2 | 100.2 | 2013 | china | | s5 | c2 | 100.2 | 2013 | china | +-----------+-------------+-------------+-----------+--------+ --查看分區資料 SELECT * FROM sale_detail_jt WHERE sale_date='2013' AND region='en'; +-----------+-------------+-------------+-----------+--------+ | shop_name | customer_id | total_price | sale_date | region | +-----------+-------------+-------------+-----------+--------+ | t1 | c5 | 200.0 | 2013 | en | | t2 | c6 | 300.0 | 2013 | en | +-----------+-------------+-------------+-----------+--------+ --建立物化視圖 CREATE MATERIALIZED VIEW mv_deferred BUILD DEFERRED AS SELECT * FROM sale_detail_jt; --查詢物化視圖 mv_deferred; SELECT * FROM mv_deferred; --返回 +-----------+-------------+-------------+-----------+--------+ | shop_name | customer_id | total_price | sale_date | region | +-----------+-------------+-------------+-----------+--------+ +-----------+-------------+-------------+-----------+--------+ --建立分區表 CREATE TABLE mf_part (id bigint,name string) PARTITIONED BY (dt string); --插入資料 INSERT INTO mf_part PARTITION(dt='2013') VALUES(1,'name1'),(2,'name2'); --查詢資料 SELECT * FROM mf_part WHERE dt='2013'; --返回: +------------+------+----+ | id | name | dt | +------------+------+----+ | 1 | name1 | 2013 | | 2 | name2 | 2013 | +------------+------+----+ --建立帶分區的物化視圖 CREATE MATERIALIZED VIEW mv_rebuild BUILD DEFERRED PARTITIONED BY (dt) AS SELECT * FROM mf_part; --查詢物化視圖資料 SELECT * FROM mv_rebuild WHERE dt='2013'; --返回 +------------+------+----+ | id | name | dt | +------------+------+----+ +------------+------+----+ --重新整理最新分區資料 ALTER MATERIALIZED VIEW mv_rebuild REBUILD PARTITION(dt=max_pt('mf_part')); --查詢物化視圖資料 SELECT * FROM mv_rebuild WHERE dt='2013'; --返回 +------------+------+----+ | id | name | dt | +------------+------+----+ | 1 | name1 | 2013 | | 2 | name2 | 2013 | +------------+------+----+
修改物化視圖的生命週期
修改已建立的物化視圖的生命週期。
命令格式
ALTER MATERIALIZED VIEW [<project_name>.]<mv_name> SET LIFECYCLE <days>;
參數說明
參數
是否必填
說明
project_name
否
物化視圖所屬目標MaxCompute專案名稱。不填寫時表示當前所在MaxCompute專案。您可以登入MaxCompute控制台,左上方切換地區後,即可在專案管理頁簽查看到具體的MaxCompute專案名稱。
mv_name
是
待更新物化視圖的名稱。
days
是
設定物化視圖的新生命週期。單位為天。
使用樣本
--修改物化視圖的生命週期為10天。 ALTER MATERIALIZED VIEW count_mv SET LIFECYCLE 10;
開啟或禁用物化視圖的生命週期
開啟或禁用已建立的物化視圖的生命週期。
命令格式
ALTER MATERIALIZED VIEW [<project_name>.]<mv_name> [<pt_spec>] enable|disable LIFECYCLE;
參數說明
參數
是否必填
說明
project_name
否
物化視圖所屬目標MaxCompute專案名稱。不填寫時表示當前所在MaxCompute專案。您可以登入MaxCompute控制台,左上方切換地區後,即可在專案管理頁簽查看到具體的MaxCompute專案名稱。
mv_name
是
待開啟或禁用生命週期的物化視圖的名稱。
pt_spec
否
待開啟或禁用生命週期的物化視圖的分區。格式為
(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)
。partition_col是分區欄位,partition_col_value是分區值。enable|disable
是
enable
代表開啟,disable
代表禁用,禁用後該分區或表就不涉及生命週期管理。使用樣本
樣本一:開啟物化視圖的生命週期管理。
ALTER MATERIALIZED VIEW mf_mv_blank_pts PARTITION (ds='1') enable LIFECYCLE;
樣本二:禁用物化視圖的生命週期管理。
ALTER MATERIALIZED VIEW mf_mv_blank_pts PARTITION (ds='1') disable LIFECYCLE;
查詢物化視圖資訊
查看物化視圖的結構、修改時間等資訊。
命令格式
DESC EXTENDED [<project_name>.]<mv_name>;
參數說明
參數
是否必填
說明
project_name
否
物化視圖所屬目標MaxCompute專案名稱。不填寫時表示當前所在MaxCompute專案。您可以登入MaxCompute控制台,左上方切換地區後,即可在專案管理頁簽查看到具體的MaxCompute專案名稱。
mv_name
是
待查詢物化視圖的名稱。
使用樣本
DESC EXTENDED mf_mv_blank_pts;
返回結果如下:
說明如下結果樣本需要MaxCompute用戶端升級至v0.43及以上版本,詳情請參見使用本地用戶端(odpscmd)串連。
+------------------------------------------------------------------------------------+ | Owner: ALIYUN$$****@***.aliyunid.com | | Project: a**** | | Schema: default | | TableComment: | +------------------------------------------------------------------------------------+ | CreateTime: 2024-12-06 10:21:40 | | LastDDLTime: 2024-12-06 10:42:19 | | LastModifiedTime: 2024-12-06 10:22:05 | +------------------------------------------------------------------------------------+ | MaterializedView: YES | | ViewText: SELECT id,name,ds FROM mf_blank_pts | | Rewrite Enabled: true | | AutoRefresh Enabled: false | +------------------------------------------------------------------------------------+ | Native Columns: | +------------------------------------------------------------------------------------+ | Field | Type | Label | ExtendedLabel | Nullable | DefaultValue | Comment | +------------------------------------------------------------------------------------+ | id | bigint | | | true | NULL | | | name | string | | | true | NULL | | +------------------------------------------------------------------------------------+ | Partition Columns: | +------------------------------------------------------------------------------------+ | ds | bigint | | +------------------------------------------------------------------------------------+ | Extended Info: | +------------------------------------------------------------------------------------+ | IsOutdated: false | | TableID: f9bda66b9496412d923c6a6715e834b6 | | IsArchived: false | | PhysicalSize: 1581 | | FileNum: 1 | | StoredAs: CFile | | CompressionStrategy: normal | | odps.timemachine.retention.days: 1 | | encryption_enable: false | +------------------------------------------------------------------------------------+
查詢物化檢視狀態
查詢物化檢視狀態,以便及時知曉源表變更,確保物化視圖有效。物化檢視狀態分為如下兩種:
物化視圖有效
執行查詢語句時,MaxCompute會從物化視圖中直接查詢資料,不會從來源資料中查詢資料。
物化視圖無效
執行查詢語句時,MaxCompute無法從物化視圖中直接查詢資料,會從來源資料中查詢資料,無法實現查詢加速。
使用者可以通過下面的函數查看物化視圖的資料是否有效。
函式宣告。
boolean materialized_view_is_valid(<mv_name>,<partition_value>);
使用樣本。
檢查mf_mv_refresh4的資料是否與原表最新的資料一致,如果一致返回
true
,否則返回false
。SELECT materialized_view_is_valid("count_mv");
SELECT materialized_view_is_valid("mf_mv_blank_pts","1");
列出專案下物化視圖
列出專案下所有的物化視圖,或符合某些規則的物化視圖。
SHOW MATERIALIZED VIEWS
命令需要在MaxCompute用戶端(odpscmd)0.43.0及以上版本中執行。
命令格式
--列出專案下所有的物化視圖。 SHOW MATERIALIZED VIEWS; --列出專案下名稱與materialized_view匹配的物化視圖。 SHOW MATERIALIZED VIEWS LIKE '<materialized_view>';
使用樣本
--列出專案下名稱與test*匹配的物化視圖名。*表示任意欄位。 SHOW MATERIALIZED VIEWS LIKE 'test*';
返回結果如下。
ALIYUN$account_name:test_two_mv ALIYUN$account_name:test_create_one_mv
刪除物化視圖
刪除已建立的物化視圖。
命令格式
DROP MATERIALIZED VIEW [IF EXISTS] [<project_name>.]<mv_name> [purge];
參數說明
參數
是否必填
說明
IF EXISTS
否
如果沒有指定IF EXISTS且物化視圖不存在會返回報錯。
project_name
否
物化視圖所屬目標MaxCompute專案名稱。不填寫時表示當前所在MaxCompute專案。您可以登入MaxCompute控制台,左上方切換地區後,即可在專案管理頁簽查看到具體的MaxCompute專案名稱。
mv_name
是
待刪除物化視圖的名稱。
purge
否
指定
purge
,在刪除物化視圖時,直接刪除資料。使用樣本
刪除物化視圖
mv
。DROP MATERIALIZED VIEW count_mv;
刪除物化視圖
mv
的同時也刪除資料。DROP MATERIALIZED VIEW count_mv purge;
刪除物化視圖分區
刪除已建立的物化視圖的單個或多個分區。
命令格式
ALTER MATERIALIZED VIEW [<project_name>.]<mv_name> DROP [IF EXISTS] PARTITION <pt_spec> [PARTITION <pt_spec>, PARTITION <pt_spec>....];
參數說明
參數
是否必填
說明
project_name
否
物化視圖所屬目標MaxCompute專案名稱。不填寫時表示當前所在MaxCompute專案。您可以登入MaxCompute控制台,左上方切換地區後,即可在專案管理頁簽查看到具體的MaxCompute專案名稱。
mv_name
是
待刪除分區的分區物化視圖的名稱。
IF EXISTS
否
如果沒有指定IF EXISTS且物化視圖不存在會返回報錯。
pt_spec
是
至少要指定一個分區。待刪除的分區。格式為
(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)
。partition_col是分區欄位,partition_col_value是分區值。使用樣本
樣本一:刪除分區物化視圖的某個分區。命令樣本如下。
ALTER MATERIALIZED VIEW mf_mv_blank_pts DROP PARTITION (ds='1');
樣本二:刪除分區物化視圖的滿足指定條件的分區。命令樣本如下。
ALTER MATERIALIZED VIEW mf_mv_blank_pts DROP PARTITION (ds>='1' AND ds<='2');
物化視圖查詢穿透
對於分區物化視圖,不一定所有分區都有資料,可能只重新整理了最新的一些分區資料。但使用者查詢資料時,實際並不知道查詢的所有分區資料是否都存在,當查詢的分區資料不存在時,需要自動實現到原始分區表去查詢資料,流程如下圖所示。
如果需要物化視圖支援穿透查詢能力,您需要設定如下參數:
建立物化視圖時,在tblproperties屬性中添加"enable_auto_substitute"="true"
配置。
物化視圖支援穿透查詢樣本如下。
建立物化視圖支援分區並且支援查詢穿透。
-- 建立src表。 CREATE TABLE src(id bigint,name string) PARTITIONED BY (dt string); -- 插入資料。 INSERT INTO src PARTITION(dt='20210101') VALUES(1,'Alex'); INSERT INTO src PARTITION(dt='20210102') VALUES(2,'Flink'); --建立分區物化視圖支援穿透。 CREATE MATERIALIZED VIEW IF NOT EXISTS mv LIFECYCLE 7 PARTITIONED BY (dt) tblproperties("enable_auto_substitute"="true") AS SELECT id, name, dt FROM src;
查詢表src中的分區為20210101的資料。
SELECT * FROM mv WHERE dt='20210101';
查詢物化視圖mv中的分區為20210102的資料,自動穿透到源表查詢資料。
SELECT * FROM mv WHERE dt = '20210102'; --因為20210102的資料沒有物化,則需要把查詢轉化到對應的源表,等價於 SELECT * FROM (SELECT id, name, dt FROM src WHERE dt='20210102') t;
查詢物化視圖mv中分區為20201230~20210102的資料,自動穿透到源表查詢的資料與物化視圖的資料執行UNION操作後再返回結果。
SELECT * FROM mv WHERE dt >= '20201230' AND dt<='20210102' AND id='5'; --因為20210102的資料沒有物化,則需要把查詢轉化到對應的源表。等價於: SELECT * FROM (SELECT id, name, dt FROM src WHERE dt='20211231' OR dt='20210102' UNION ALL SELECT * FROM mv WHERE dt='20210101' ) t WHERE id = '5';
計費規則
物化視圖費用包含如下兩部分:
儲存費用
物化視圖會佔用實體儲存體空間,會產生儲存費用,隨用隨付。更多計費資訊,請參見儲存費用(隨用隨付)。
計算費用
建立、更新、查詢物化視圖及查詢改寫(物化視圖有效)過程中涉及到查詢資料,會消耗計算資源產生計算費用。
當MaxCompute專案的規格類型為訂用帳戶時,不單獨收費。
當MaxCompute專案的規格類型為隨用隨付時,按照SQL複雜度及輸入資料量計算費用。更多計費資訊,請參見SQL標準計費。您需要注意如下資訊:
更新物化視圖執行的SQL與建立物化視圖執行的SQL相同,如果該物化視圖所在專案綁定的是預付費(訂用帳戶)計算資源群組,那麼會使用已經購買的預付費資源,不會有額外費用;如果綁定的是後付費資源群組,費用取決於執行SQL時輸入的資料量和複雜度。同時重新整理物化視圖後會按照實際儲存大小收取儲存費用。
當物化視圖處於生效狀態時查詢改寫會從物化視圖中讀取資料,查詢語句的輸入資料量(從物化視圖讀取部分)與物化視圖相關,與物化視圖源表無關。當物化視圖處於失效狀態時不支援查詢改寫,查詢語句會直接查詢源表,查詢語句的輸入資料量與源表相關。更多查詢物化檢視狀態資訊,請參見查詢物化檢視狀態。
由於多表關聯產生物化視圖會產生資料膨脹等原因,從物化視圖讀取的資料量不一定絕對小於源表,MaxCompute不能保證讀取物化視圖一定比讀取源表節省費用。
相關文檔
關於物化視圖查詢改寫操作的相關內容,詳情請參見物化視圖查詢改寫。
關於物化視圖定時更新功能的相關內容,詳情請參見物化視圖定時更新。