最近更新时间:2023.03.03 15:40:44
首次发布时间:2022.12.07 20:22:18
物化视图主要通过预计算的方式,解决高频子查询重复计算的问题。
CREATE [OR REPLACE] MATERIALIZED VIEW [IF NOT EXISTS] [db_name.]mview_name [(column_name [COMMENT column_comment], ...) ] [PARTITIONED BY (col_name, col_name, ...)] [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS ] [COMMENT view_comment] [TBLPROPERTIES (property_name=property_value, ...)] [AS] select_statement;
参数 | 是否可选 | 说明 |
---|---|---|
[db_name.]mview_name | 否 | 物化视图名称,如果不设置 db_name,则默认为当前数据库。 |
select_statement | 否 |
|
(column_name [COMMENT column_comment], ...) | 是 | 指定物化视图包含的 column 信息,会与 select_statement 的 select list 依次对应:
column_list 必须包含如下所有列:
|
PARTITIONED BY (col_name, col_name, ...) | 是 | 设置分区列,关于分区列的进一步说明可见 其他说明。 |
OR REPLACE | 是 | 替换同名物化视图,继承其所有 schema 信息,但不会继承原本数据。 |
IF NOT EXISTS | 是 | 当 mview_name 已经存在对应实体表,创建同名视图会报错,如果设置此参数,则不会报错。 |
CLUSTERED BY (col_name, col_name, ...) | 是 | 设置 Bucket 信息,用于创建 Bucket 物化视图。 |
COMMENT mview_comment | 是 | 设置 comment。 |
TBLPROPERTIES (property_name=property_value, ...) | 是 | 设置 Table Properties。 |
ALTER MATERIALIZED VIEW [db_name.]mview_name ( SET COMMENT mview_comment | SET TBLPROPERTIES (property_name=property_value, ...) | )
参数 | 是否可选 | 说明 |
---|---|---|
[db_name.]mview_name | 否 | 物化视图名称,如果不设置 db_name,则默认为当前数据库。 |
COMMENT mview_comment | 是 | 修改 comment。 |
TBLPROPERTIES (property_name=property_value, ...) | 是 | 修改 Table Properties。 |
DROP MATERIALIZED VIEW [IF EXISTS] [db_name.]mview_name
参数 | 是否可选 | 说明 |
---|---|---|
[db_name.]mview_name | 否 | 物化视图名称,如果不设置 db_name,则默认为当前数据库。 |
IF EXISTS | 是 | 当删除的物化视图不存在的时,设置此参数可以不报错。 |
SHOW MATERIALIZED VIEWS [(IN db_name) | (ON [db_name.]table_name)] [[LIKE] 'identifier_with_wildcards']
参数 | 是否可选 | 说明 |
---|---|---|
IN db_name | 是 | 展示 db_name 中的所有物化视图; |
ON [db_name.]table_name | 是 | 展示基表为 table_name 的物化视图。 |
[LIKE] 'identifier_with_wildcards' | 是 | 使用正则对物化视图名称进行过滤,例如 like '%mv1%',则会显示 name 为 amv1, amv2 的物化视图。 |
Key | 说明 |
---|---|
database | 物化视图/实体表所在数据库名称 |
materializedViewName | 视图名称 |
type | 视图类型:Aggregate |
valid | 是否有效:True / False |
definition | 视图定义 |
SHOW CREATE MATERIALIZED VIEW [db_name.]mview_name
DESC[RIBE] MATERIALIZED VIEW [EXTENDED | FORMATTED] [db_name.]mview_name
参数 | 是否可选 | 说明 |
---|---|---|
[db_name.]mview_name | 否 | 物化视图名称,如果不设置 db_name,则默认为当前数据库。 |
EXTENDED | 是 | 展示更加全面的信息。 |
Key | 说明 | |
---|---|---|
#Column Information | col_name | column 名称 |
data_type | 数据类型 | |
comment | Comment | |
materialized_view_origin_expr | column 原始表达式 | |
#Partition Information | col_name | column 名称 |
data_type | 数据类型 | |
comment | Comment | |
materialized_view_origin_expr | column 原始表达式 | |
#Detailed MView Information | Database | 物化视图/实体表所在数据库名称 |
MView Name | 物化视图的名称(用户指定的名称) | |
MView Definition | 物化视图定义,创建时指定的 select_statement,如果用户指定 column_list,则此处会存储:select column_list from select_statement。 | |
MView Type | Aggregate | |
Base Tables | 基表名称列表: db_name.table1 | |
Rewrite Eanble | true / false | |
Valid | 当前视图是否有效,True / False,如果设置为 False,则可以 Drop。 | |
Owner | 创建者名称 | |
Created Times | MView 的创建时间 | |
Last Refreshed | MView 的最后修改时间 | |
Provider | 例如:Parquet/ORC | |
Num Buckets | Bucket 相关 | |
Bucket Columns | Bucket 相关 | |
Sort Columns | Bucket 相关 | |
Comment | Comment |
离线 SQL 查询需要开启如下参数:
set bytequery.sql.materialized.view.query.enabled=true;
点击表管理页面 - DDL 建表/视图
CREATE TABLE test_olap.emps_part( empid INT, deptno INT, locationid INT, empname STRING, salary Int, ts STRING) PARTITIONED BY (date string COMMENT 'date partition') COMMENT 'emps partition table' STORED AS bytelake_mor TBLPROPERTIES ( 'bytelake.recordkey.fields' = 'empid', 'bytelake.precombine.fields' = 'ts' );
CREATE MATERIALIZED VIEW test_olap.mv_emps_part PARTITIONED BY (date) select empid, deptno, sum(salary) as total_salary, date from test_olap.emps_part group by empid, deptno, date
insert into test_olap.emps_part partition (date='20221011') values (1, 1, 1, 'a', 10, '111'), (1, 1, 1, 'a', 99, '111'), (2, 1, 1, 'b', 5, '111'), (3, 2, 1, 'c', 11, '111');
REFRESH MATERIALIZED VIEW test_olap.mv_emps_part partition (date='20221011');
select * from test_olap.emps_part where date = '20221011'; select * from test_olap.mv_emps_part where date = '20221011';
-- set tqs.targeting.worker=10.250.20.131:9305; set tqs.query.engine.type=sparkcli; set bytequery.sql.materialized.view.query.enabled=true; select empid, deptno, sum(salary) as total_salary from test_olap.emps_part where date = '20221011' group by empid, deptno;
CREATE TABLE test_olap.xy_emps( empid INT, deptno INT, locationid INT, empname STRING, salary Int, ts STRING) COMMENT 'emps table' STORED AS bytelake_mor TBLPROPERTIES ( 'bytelake.recordkey.fields' = 'empid', 'bytelake.precombine.fields' = 'ts' );
CREATE MATERIALIZED VIEW test_olap.xy_mv_emps as select empid, deptno, sum(salary) as total_salary from test_olap.xy_emps group by empid, deptno
insert into test_olap.xy_emps values (1, 1, 1, 'a', 10, '111'), (1, 1, 1, 'a', 99, '111'), (2, 1, 1, 'b', 5, '111'), (3, 2, 1, 'c', 11, '111');
REFRESH MATERIALIZED VIEW test_olap.xy_mv_emps;
select * from test_olap.xy_emps; select * from test_olap.xy_mv_emps;
set tqs.query.engine.type=sparkcli; set bytequery.sql.materialized.view.query.enabled=true; select empid, deptno, sum(salary) as total_salary from test_olap.xy_emps group by empid, deptno;
select_statement 中的基表仅支持单个 LAS 内表;
select_statement 的 output 不能包含任何基表的分区列;
select_statement 中的函数必须都是确定性(deterministic)的,例如不能存在:CURRENT_TIME、CURRENT_TIMESTAMP、RAND 等函数;
聚合函数仅支持:SUM、COUNT、MIN、MAX;
不支持算子:Window function、ORDER BY clause、LIMIT clause、嵌套子查询、UDTF (user defined table function);
不支持 distinct :count(distinct col1);