在Hologres中如何使用物化视图
发布日期:2025-01-04 11:29 点击次数:81
实时物化视图将对明细表的数据进行预先聚合,存储为物化视图,通过查询物化视图,减少计算量,显著提升查询性能。本文为您介绍在Hologres中如何使用物化视图。使用限制当前实时物化视图不支持对明细表进行Delete或Update操作,所以需要将明细表设置appendonly属性,当前对明细表任何的Delete或Update操作会提示: Table XXX is append-only。Flink实时写入时mutateType也只支持InsertOrIgnore。当前不支持异步创建物化视图,需要创建明细表的同时创建基于该表的物化视图。当前仅支持单表的物化视图,不支持CTE、多表JOIN、子查询、不支持WHERE条件、ORDER BY、LIMIT、HAVING语句。实时物化视图的GROUP BY Key和Value都不支持表达式,比如不支持SUM(CASE WHEN COND THEN A ELSE B END)、SUM(col1 + col2)、GROUP BY date_trunc('hour', ts)。每张明细表最多创建10个物化视图,物化视图数量和资源消耗成正比。如果基于分区表创建物化视图,物化视图的GROUP BY Key必须包含分区表的分区列,且不能对分区表的子表创建物化视图,只能针对分区表父表创建。如果基于分区表创建物化视图,不支持ATTACH PARTITION至父表语法,支持CREATE TABLE PARTITION OF语法。对于创建了物化视图的明细表,暂不支持DROP COLUMN。物化视图的底层数据与明细表的TTL一致,不可以手动设置物化视图的TTL,否则会出现物化视图数据和明细表数据不一致的情况。支持的聚合函数SQL示例创建实时物化视图BEGIN;
CREATE TABLE base_sales(
day text not null,
hour int ,
ts timestamptz,
amount float,
pk text not null primary key
);
CALL SET_TABLE_PROPERTY('base_sales', 'mutate_type', 'appendonly');
--当实时物化视图被Drop后,可以取消明细表的appendonly属性,执行以下命令
--CALL SET_TABLE_PROPERTY('base_sales', 'mutate_type', 'none');
CREATE MATERIALIZED VIEW mv_sales AS
SELECT
day,
hour,
avg(amount) AS amount_avg
FROM base_sales
GROUP BY day, hour;
COMMIT;
insert into base_sales values(to_char(now(),'YYYYMMDD'),'12',now(),100,'pk1');
insert into base_sales values(to_char(now(),'YYYYMMDD'),'12',now(),200,'pk2');
insert into base_sales values(to_char(now(),'YYYYMMDD'),'12',now(),300,'pk3');分区表创建物化视图BEGIN;
CREATE TABLE base_sales_p(
day text not null,
hour int,
ts timestamptz,
amount float,
pk text not null,
primary key (day, pk)
) partition by list(day);
CALL SET_TABLE_PROPERTY('base_sales_p', 'mutate_type', 'appendonly');
--day是分区列,要出现在视图的group by的条件中
CREATE MATERIALIZED VIEW mv_sales_p AS
SELECT
day,
hour,
avg(amount) AS amount_avg
FROM base_sales_p
GROUP BY day, hour;
COMMIT;
create table base_sales_20220101 partition of base_sales_p for values in('20220101');查询物化视图SELECT * FROM mv_sales WHERE day = to_char(now(),'YYYYMMDD') AND hour = 12;删除物化视图DROP MATERIALIZED VIEW mv_sales;查询物化视图占用存储空间select pg_relation_size('mv_sales');查询所有物化视图底层占用空间SELECT schemaname