当我添加limit 1
时,我的查询变得非常慢。PostgreSQL查询速度非常慢,限制为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多分钟后)
当没有给定对象ID的值时(如果有结果,速度很快),此查询非常慢。 如果我删除它告诉我的极限几乎是瞬间,有没有结果:
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个不同的objectID。
我在两个字段上都有单独的索引:timestamp
和objectID
。
我在表格上完成了vacuum analyze
,并且我重新编制了表格。
此外慢速查询变快时,我将限制设置为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)
总的来说,我认为它与策划者做出关于exectution成本错误的假设做,因此选择了较慢的执行计划。
这是真正的原因吗?有没有解决方案?
对于'极限1'的情况你的意思是表扫描?你写了索引扫描 – harmic
@harmic:OP在那里有一个索引扫描...不一定是整个表,但肯定比PG想象的要多得多。 –
你是对的!我只读到OP的文本,他说它没有使用索引。但它选择扫描时间戳索引;奇怪的选择 – harmic