You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在QuestDB中将SAMPLE BY查询改写为GROUP BY查询以实现多线程执行?

如何在QuestDB中将SAMPLE BY查询改写为GROUP BY查询以实现多线程执行?

嗨,这个问题我刚好有经验!你说得没错,QuestDB里的SAMPLE BY是单线程优化的,而GROUP BY可以利用多线程来加速查询,确实是个不错的优化思路。不过date_trunc确实只能支持固定的时间单位(比如秒、分钟),没法直接指定10秒这种自定义间隔,不过我们可以用时间戳的数值运算来实现完全相同的效果。

核心思路是:利用QuestDB中timestamp类型以微秒级Unix时间戳存储的特性,通过整数除法把时间戳“归整”到10秒的间隔上,再用这个归整后的值作为分组依据。具体改写后的SQL如下:

SELECT 
  -- 计算10秒间隔的起始时间,保持timestamp类型的数值格式
  (ts / 10000000) * 10000000 AS ts,
  min(temp),
  max(temp),
  avg(temp)
FROM temperature
GROUP BY (ts / 10000000) * 10000000;

如果希望查询结果中的ts字段更直观,也可以用to_timestamp函数把数值转成标准的时间格式:

SELECT 
  to_timestamp((ts / 10000000) * 10000000) AS ts,
  min(temp),
  max(temp),
  avg(temp)
FROM temperature
GROUP BY (ts / 10000000) * 10000000;

原理说明:

10秒等于10,000,000微秒,用原始时间戳除以这个数值会得到一个整数(相当于每个10秒间隔的“序号”),再乘以回去就得到该间隔的起始时间——这和SAMPLE BY 10s的分组逻辑完全一致。

这种方法还支持任意自定义时间间隔,比如要按30秒分组,只需要把公式里的10000000换成30000000(30*1000000)就行。

这样改写后,QuestDB就会启用多线程来执行GROUP BY查询,达到你想要的性能提升效果啦!

备注:内容来源于stack exchange,提问作者Andrei Pechkurov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 07:58:14