使用这两个查询从 QuestDB 中的表中选择最新时间戳时,性能存在很大差异。
此查询大约需要 46 毫秒。
SELECT timestamp FROM <table_name> ORDER BY timestamp DESC LIMIT 1
这个需要约 165 毫秒。
SELECT last(timestamp) FROM <table_name>
两个查询返回相同的结果,但是使用
last
时速度要慢得多。我在这里错过了什么吗?
使用
ORDER BY
和 LIMIT
的查询经过高度优化,特别是在使用指定时间戳时。 questdb 表中的数据物理存储时按增量时间戳排序,因此我们可以有效地检索最新条目。
last
聚合函数在内部被视为GROUP BY
,因此需要进行完整扫描才能获取最后一个值。目前 QuestDB 没有针对无操作情况(即没有有意义的聚合时)进行优化。对于这些查询,您最好像您一样使用替代方案重写。
顺便说一下,QuestDB 接受负数限制,所以你可以这样做
SELECT timestamp FROM <table_name> LIMIT -1
访问最后一行,因为数据按增量指定时间戳排序。
GitHub 上有一个相关的 问题可以自动优化 First 和 Last 聚合函数,但目前最好的选择是查询重写