Blog
paimon-06 DQL
批量查询
在sql-client中设置执行模式为批即可
RESET 'execution.checkpointing.interval';
SET 'execution.runtime-mode' = 'batch';
时间旅行
读取指定id的快照
SELECT * FROM ws_t /*+ OPTIONS('scan.snapshot-id'='1') */;
SELECT * FROM ws_t /*+ OPTIONS('scan.snapshot-id'='2') */;
读取指定时间戳的快照
SELECT * FROM ws_t$snapshots;
SELECT * FROM ws_t /*+ OPTIONS('scan.timestamp-millis'='1693367351380') */;
读取指定标签
SELECT * FROM ws_t /*+ OPTIONS('scan.tag-name'='my-tag') */;
增量查询
去读开始快照(不包括)和结束快照之间的增量更改
比如3,5表示快照3和快照5之间的更改
SELECT * FROM ws_t /*+ OPTIONS('incremental-between'='3,5') */;
在batch模式中,不反悔DELETE记录,因此-D的记录将被删除,如果你想查看DELETE记录,可以查询audit_log表
SELECT * FROM ws_t$audit_log /*+ OPTIONS('incremental-between'='3,5') */;
流式查询
默认清空下Streaming read在第一次启动时会生成表上的最新快照,并继续读取最新更改
SET 'execution.checkpointing.interval'='30s';
SET 'execution.runtime-mode' = 'streaming';
也可以从最新读取,设置扫描模式
SELECT * FROM ws_t /*+ OPTIONS('scan.mode'='latest') */;
时间旅行
如果只想处理今天及以后的数据,则可以使用分区过滤器来实现
SELECT * FROM test_p WHERE dt > '2023-07-01'
如果不是分区表,或者无法按分区筛选,可以使用时间旅行读取流
从指定快照id开始读取变更数据
SELECT * FROM ws_t /*+ OPTIONS('scan.snapshot-id'='1') */;
从指定时间戳开始读取
SELECT * FROM ws_t /*+ OPTIONS('scan.timestamp-millis'='1693367351380') */;
第一次启动时读取指定快照数据,并继续读取变化
SELECT * FROM ws_t /*+ OPTIONS('scan.mode'='from-snapshot-full', 'scan.snapshot-id'='3') */;
Consumer ID
优点
在流式读取表时指定consumer-id,这是一个实验性功能
当流读取paimon表时 下一个快照将被记录到文件系统中,这有几个优点
- 当之前的作业停止后,新启动的作业可以继续消费之前的进度,而不需要从状态恢复。新的读取将从消费者文件中找到的下一个快照ID开始读取
- 在判断一个快照是否过期时,paimon会查看文件系统中该表的所有消费者,如果还有消费者依赖这个快照,那么这个快照就不会因为过期而被删除
- 当没有水印定义时,paimon表会将快照中的水印传递到下游paimon表,这意味着可以追踪整个管道的水印进度
注意消费者将防止快照过期,可以指定consumer.expiration-time来管理消费者的声明周期
案例演示
- 指定consumer-id开始流式查询
SELECT * FROM ws_t /*+ OPTIONS('consumer-id'='test') */;
停止调原先的流式查询插入数据
INSERT INTO ws_t VALUES(6,6,6);
再次指定consumer-id流式查询
SELECT * FROM ws_t /*+ OPTIONS('consumer-id'='test') */;
查询优化
强烈建议在查询时指定分区和主键过滤器,这将加快查询的数据跳过速度
可以加速数据条约的过滤函数有:
- =
- <
- <=
- >
- >=
- IN(...)
- LIKE 'abc%'
- IS NULL
paimon会按主键对数据进行排序,从而加快点查询和查询范围的速度
使用复合主键时,查询过滤器最好形成主键的最左边前缀,以获得良好的加速效果
- 按照主键从最左边开始 效果最好