gpt4 book ai didi

PostgreSQL 查询非常慢,限制为 1

转载 作者:行者123 更新时间:2023-11-29 11:06:38 25 4
gpt4 key购买 nike

当我添加 limit 1 时,我的查询变得非常慢。

我有一个表 object_values,其中包含对象的时间戳值:

 timestamp |  objectID |  value
--------------------------------
2014-01-27| 234 | ksghdf

我想获取每个对象的最新值:

SELECT * FROM object_values WHERE (objectID = 53708) ORDER BY timestamp DESC LIMIT 1;

(10多分钟后我取消了查询)

当给定的 objectID 没有值时,此查询非常慢(如果有结果则很快)。如果我删除限制,它几乎立即告诉我没有结果:

SELECT * FROM object_values WHERE (objectID = 53708) ORDER BY timestamp DESC;  
...
Time: 0.463 ms

一个解释告诉我没有限制的查询使用索引,而 limit 1 的查询不使用索引:

慢查询:

explain SELECT * FROM object_values WHERE (objectID = 53708) ORDER BY timestamp DESC limit 1;  
QUERY PLAN`
----------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.00..2350.44 rows=1 width=126)
-> Index Scan Backward using object_values_timestamp on object_values (cost=0.00..3995743.59 rows=1700 width=126)
Filter: (objectID = 53708)`

快速查询:

explain SELECT * FROM object_values WHERE (objectID = 53708) ORDER BY timestamp DESC;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------
Sort (cost=6540.86..6545.11 rows=1700 width=126)
Sort Key: timestamp
-> Index Scan using object_values_objectID on working_hours_t (cost=0.00..6449.65 rows=1700 width=126)
Index Cond: (objectID = 53708)

该表包含 44,884,559 行和 66,762 个不同的对象 ID。
我在两个字段上都有单独的索引:timestampobjectID
我对表进行了真空分析,并重新索引了表。

此外,当我将限制设置为 3 或更高时,慢查询变得很快:

explain SELECT * FROM object_values WHERE (objectID = 53708) ORDER BY timestamp DESC limit 3;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------
Limit (cost=6471.62..6471.63 rows=3 width=126)
-> Sort (cost=6471.62..6475.87 rows=1700 width=126)
Sort Key: timestamp
-> Index Scan using object_values_objectID on object_values (cost=0.00..6449.65 rows=1700 width=126)
Index Cond: (objectID = 53708)

一般来说,我认为这与计划者对执行成本做出错误假设有关,因此选择了较慢的执行计划。

这是真正的原因吗?有解决办法吗?

最佳答案

您可以通过向查询添加不需要的 ORDER BY 子句来避免此问题。

SELECT * FROM object_values WHERE (objectID = 53708) ORDER BY timestamp, objectID DESC limit 1;

关于PostgreSQL 查询非常慢,限制为 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21385555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com