Questdb 优化

发布时间:2026/9/6 5:11:33
Questdb 优化 QuestDB LATEST ON / LATEST BY 查询十几秒慢核心原因几十亿行LATEST ON timestamp PARTITION BY device_id,pname慢到十几秒90% 都是下面 4 个坑QuestDB Co...1、device_id /pname 没有设置成SYMBOL头号元凶如果你的device_id、pname是STRING/VARCHAR而不是SYMBOLLATEST ON必须扫描全表找出全部不重复设备再反向扫描时间几十亿数据直接十几秒。✅正确建表sqlCREATE TABLE flow_meter_records ( timestamp TIMESTAMP, device_id SYMBOL CAPACITY 50000 CACHE, pname SYMBOL CAPACITY 200 CACHE, value DOUBLE ) TIMESTAMP(timestamp) PARTITION BY DAY WAL;SYMBOL重复多的字符串内部字典编码LATEST ON可以反向分区扫描找到每个设备最新行立刻停止毫秒级返回QuestDB Co...。❌不要用 STRING 做 PARTITION BY 字段。⚠️已经建好的表不能直接改列类型只能新建表迁移数据。2、不要不带时间条件查全部历史分区几十亿几百个历史分区LATEST ON会从最早分区开始扫。优化加一个大时间窗口 WHERE告诉数据库不用扫描很早的旧分区sqlSELECT * FROM flow_meter_records LATEST ON (timestamp) PARTITION BY device_id,pname WHERE timestamp dateadd(d,‑90,now());只扫描最近 90 天分区跳过几年前冷分区速度直接几倍提升。 业务上设备最新数据一定发生在最近几十天很久没有上报的设备直接过滤掉。3、Designated Timestamp 丢失timestamp必须是表的TIMESTAMP()指定字段不能套 cast 函数。套cast(timestamp as timestamp)会破坏分区裁剪变成全扫描GitHub。❌错误sqlLATEST ON (cast(timestamp as timestamp)) PARTITION BY device_id,pname✅正确sqlLATEST ON (timestamp) PARTITION BY device_id,pname4、老版本 QuestDB Bug老版本LATEST ON高基数设备性能差尽量升级到新版本。两种业务方案水务项目实际落地方案 A查询所有设备最新值用上面优化后的 SQLsqlSELECT * FROM flow_meter_records LATEST ON (timestamp) PARTITION BY device_id,pname WHERE timestamp dateadd(d,‑90,now());前提device_id、pname是SYMBOL类型。方案 B强烈推荐生产环境维护一张最新值快照表几十亿原始表永远不要频繁跑LATEST ON做接口查询定时任务1 分钟 / 5 分钟跑一次 LATEST ON把每个设备最新结果写入一张小表flow_meter_latest。Java 接口直接查询这张小快照表毫秒返回0 压力。原始大表只做历史查询、报表统计。示例sql-- 定时任务执行覆盖更新最新状态 INSERT INTO flow_meter_latest SELECT * FROM flow_meter_records LATEST ON (timestamp) PARTITION BY device_id,pname WHERE timestamp dateadd(d,‑90,now()) ON CONFLICT(device_id,pname) DO UPDATE;接口直接查sqlSELECT * FROM flow_meter_latest where device_id ?;排查命令看是不是扫描大量分区sqlEXPLAIN SELECT * FROM flow_meter_records LATEST ON (timestamp) PARTITION BY device_id,pname WHERE timestamp dateadd(d,‑90,now());看输出确认有partition pruning分区裁剪生效。补充查单个设备的最新一条不要用 LATEST ON直接排序取第一条sqlSELECT * FROM flow_meter_records WHERE device_idDEV001 AND pname累计流量 ORDER BY timestamp DESC LIMIT 1;device_id 为 SYMBOL这个查询会非常快。总结device_id、pname务必设置为SYMBOL不要用 stringLATEST ON查询必须加时间条件裁剪旧分区高频接口不要直接查几十亿大表维护一张小的最新快照表designated timestamp 不要套 cast 函数。