QuestDB使用LATEST BY查询时耗时随表行数线性增长问题咨询
性能不符合预期的核心原因
- SYMBOL列未配置索引
你在定义ObjectType字段时仅设置了容量和缓存参数,未添加index标识开启索引。QuestDB的LATEST BY低延迟查询路径完全依赖目标列的索引结构,无索引时数据库必须扫描全表所有行来匹配where条件、筛选最新值,耗时自然会随表内行数/分区数线性增长。 - 查询写法未适配场景特性
你的查询先通过where限定了objectType = 'queue',过滤后ObjectType仅存在唯一固定值,此时使用LATEST BY属于不必要的逻辑开销,无法触发最优执行计划。
优化方案
- 给
ObjectType字段新增索引
如果是新建表,修改建表语句给对应字段加索引即可:
CREATE TABLE metric( ObjectType SYMBOL capacity 2 cache index, ObjectId SYMBOL capacity 20000 cache, Group SYMBOL capacity 4000 cache, Region SYMBOL capacity 20 cache, CC Symbol capacity 50 cache, value DOUBLE, timestamp TIMESTAMP ) timestamp(timestamp) PARTITION BY DAY;
如果表已经存在,执行语句添加索引:
ALTER TABLE metric ALTER COLUMN ObjectType ADD INDEX;
- 调整单值过滤场景的查询写法
针对你当前固定值过滤取最新的需求,直接按时间戳倒序取第一条即可,性能比LATEST BY更优:
select value from metric where objectType= 'queue' ORDER BY timestamp DESC LIMIT 1;
内容的提问来源于stack exchange,提问作者Doncarleone512
相关产品推荐
相关产品推荐

