为什么`last`聚合比`ORDER BY`和`LIMIT`慢?

问题描述 投票:0回答:1

使用这两个查询从 QuestDB 中的表中选择最新时间戳时,性能存在很大差异。

此查询大约需要 46 毫秒。

SELECT timestamp FROM <table_name> ORDER BY timestamp DESC LIMIT 1

这个需要约 165 毫秒。

SELECT last(timestamp) FROM <table_name>

两个查询返回相同的结果,但是使用

last
时速度要慢得多。我在这里错过了什么吗?

sql time-series questdb
1个回答
0
投票

使用

ORDER BY
LIMIT
的查询经过高度优化,特别是在使用指定时间戳时。 questdb 表中的数据物理存储时按增量时间戳排序,因此我们可以有效地检索最新条目。

last
聚合函数在内部被视为
GROUP BY
,因此需要进行完整扫描才能获取最后一个值。目前 QuestDB 没有针对无操作情况(即没有有意义的聚合时)进行优化。对于这些查询,您最好像您一样使用替代方案重写。

顺便说一下,QuestDB 接受负数限制,所以你可以这样做

SELECT timestamp FROM <table_name> LIMIT -1

访问最后一行,因为数据按增量指定时间戳排序。

GitHub 上有一个相关的 问题可以自动优化 First 和 Last 聚合函数,但目前最好的选择是查询重写

© www.soinside.com 2019 - 2024. All rights reserved.