YMatrix 文档
关于 YMatrix
标准集群部署
数据写入
SQL 参考
- ABORT
- ALTER_DATABASE
- ALTER_EXTENSION
- ALTER_EXTERNAL_TABLE
- ALTER_FOREIGN_DATA_WRAPPER
- ALTER_FOREIGN_TABLE
- ALTER_FUNCTION
- ALTER_INDEX
- ALTER_RESOURCE_GROUP
- ALTER_RESOURCE_QUEUE
- ALTER_ROLE
- ALTER_RULE
- ALTER_SCHEMA
- ALTER_SEQUENCE
- ALTER_SERVER
- ALTER_TABLE
- ALTER_TABLESPACE
- ALTER_TYPE
- ALTER_USER_MAPPING
- ALTER_VIEW
- ANALYZE
- BEGIN
- CHECKPOINT
- COMMIT
- COPY
- CREATE_DATABASE
- CREATE_EXTENSION
- CREATE_EXTERNAL_TABLE
- CREATE_FOREIGN_DATA_WRAPPER
- CREATE_FOREIGN_TABLE
- CREATE_FUNCTION
- CREATE_INDEX
- CREATE_RESOURCE_GROUP
- CREATE_RESOURCE_QUEUE
- CREATE_ROLE
- CREATE_RULE
- CREATE_SCHEMA
- CREATE_SEGMENT_SET
- CREATE_SEQUENCE
- CREATE_SERVER
- CREATE_TABLE
- CREATE_TABLE_AS
- CREATE_TABLESPACE
- CREATE_TYPE
- CREATE_USER_MAPPING
- CREATE_VIEW
- DELETE
- DROP_DATABASE
- DROP_EXTENSION
- DROP_EXTERNAL_TABLE
- DROP_FOREIGN_DATA_WRAPPER
- DROP_FOREIGN_TABLE
- DROP_FUNCTION
- DROP_INDEX
- DROP_RESOURCE_GROUP
- DROP_RESOURCE_QUEUE
- DROP_ROLE
- DROP_RULE
- DROP_SCHEMA
- DROP_SEGMENT_SET
- DROP_SEQUENCE
- DROP_SERVER
- DROP_TABLE
- DROP_TABLESPACE
- DROP_TYPE
- DROP_USER_MAPPING
- DROP_VIEW
- END
- EXPLAIN
- GRANT
- INSERT
- LOAD
- LOCK
- REINDEX
- RELEASE_SAVEPOINT
- RESET
- REVOKE
- ROLLBACK_TO_SAVEPOINT
- ROLLBACK
- SAVEPOINT
- SELECT INTO
- SET ROLE
- SET TRANSACTION
- SET
- SHOW
- START TRANSACTION
- TRUNCATE
- UPDATE
- VACUUM
持续聚集
1. 背景介绍
实际场景中,聚集查询十分常见,因为聚集查询一般基于较大数量级的基础数据集,并对其进行归纳分组聚合运算,所以通常被认为是一种耗时相对较高的查询种类,且多用于分析型的场景。另外,实际场景中对聚集查询的执行频率越来越频繁,同时对聚集查询的响应时间要求也越来越高。
持续聚集即是一种能快速响应聚集查询的机制。创建持续聚集后,在数据写入过程中,系统自动实时对原数据进行聚集计算,因为和原表数据事务级同步,建议用户尽可能直接查询持续聚集视图。
2. 使用方法
2.1 创建扩展
持续聚集依赖 matrixts
扩展,首先创建扩展:
CREATE EXTENSION matrixts;
2.2 创建数据表
数据表即原始数据表:
CREATE TABLE metrics(
time timestamp,
tag_id int,
sensor float4
)
Distributed by(tag_id);
2.3 创建持续聚集视图
持续聚集使用物化视图来存储聚集后的结果,需要在创建视图时给出 WITH (CONTINUOUS)
关键字,和聚集语句:
CREATE VIEW cv1 WITH (CONTINUOUS) AS
SELECT tag_id, COUNT(*), SUM(sensor)
FROM metrics GROUP BY tag_id;
2.4 向源数据表插入数据
INSERT INTO metrics VALUES(NOW(), 1, 1.1);
INSERT INTO metrics VALUES(NOW(), 1, 1.2);
INSERT INTO metrics VALUES(NOW(), 2, 2.1);
INSERT INTO metrics VALUES(NOW(), 2, 2.2);
2.5 查询持续聚集视图
使用持续聚集时,只要向原始数据表插入时序数据,物化视图就会自动计算好结果:
SELECT * FROM cv1 ORDER BY tag_id;
tag_id | count | sum
--------+-------+-----------
1 | 2 | 2.3000002
2 | 2 | 4.3
(2 rows)
物化视图的结果与对原表进行聚合计算的结果相同:
SELECT tag_id, COUNT(*), SUM(sensor)
FROM metrics
GROUP BY tag_id
ORDER BY tag_id;
tag_id | count | sum
--------+-------+-----------
1 | 2 | 2.3000002
2 | 2 | 4.3
(2 rows)
如果在创建持续聚集时源表已经有数据,默认也会将数据同步过来。如果不需要同步的话,在创建视图时需要将参数 POPULATE
手动设定为 false
(默认为 true
):
CREATE VIEW cv1 WITH (CONTINUOUS, POPULATE=false) AS
SELECT tag_id, COUNT(*), SUM(sensor)
FROM metrics GROUP BY tag_id;
3. 维护方法
YMatrix 提供了对持续聚集进行维护的 UDF(User Defined Functions):
-
matrixts_internal.analyze_continuous_view(rel REGCLASS)
ANALYZE 物化视图,可以更新统计信息,有利于优化器做计算:
SELECT matrixts_internal.analyze_continuous_view('cv1');
-
matrixts_internal.vacuum_continuous_view(rel REGCLASS, full BOOL)
VACUUM 物化视图,可以清理 Dead Tuple,使空间重复利用;第二个参数为 true 的话会重建表文件、减少存储空间:
SELECT matrixts_internal.vacuum_continuous_view('cv1', true);
-
matrixts_internal.rebuild_continuous_view(rel REGCLASS)
重建物化视图,适用于源数据表做了更新删除,重新全量同步数据的场景:
SELECT matrixts_internal.rebuild_continuous_view('cv1');
4. FAQ
- 物化视图的数据与源表是实时同步的吗?
- 是的,源表插入数据提交后,即可从物化视图查询到
- 持续聚集可以保证 ACID(Atomicity、Consistency、Isolation、Durability)吗?
- 可以的,物化视图中的数据与原表数据使用相同的事务 ID
- 如何处理更新删除?
- 原表的更新删除以及 DROP 并不会体现在持续聚集视图中,但支持 upsert 更新和非空最新值 last_not_null 聚合
- 持续聚集对窗口函数有效吗?
- 暂不支持窗口函数
- 持续聚集是否支持 partition 表?
- 支持
- 持续聚集支持多表聚集吗?
- 不支持
- 一张表可以定义多个持续聚集吗?
- 可以