添加a时,我的查询速度很慢limit 1.
我有一个表格,object_values 其中包含对象的带时间戳值:
timestamp | objectID | value
--------------------------------
2014-01-27| 234 | ksghdf
Run Code Online (Sandbox Code Playgroud)
每个对象我想得到最新的价值:
SELECT * FROM object_values WHERE (objectID = 53708) ORDER BY timestamp DESC LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
(超过10分钟后我取消了查询)
当没有给定objectID的值时,此查询非常慢(如果有结果则速度很快).如果我删除限制它几乎立即告诉我没有结果:
SELECT * FROM object_values WHERE (objectID = 53708) ORDER BY timestamp DESC;
...
Time: 0.463 ms
Run Code Online (Sandbox Code Playgroud)
一个解释告诉我,无限制的查询使用索引,其中查询与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 …Run Code Online (Sandbox Code Playgroud) 我有一张桌子,我们称之为"foos",其中有近600万条记录.我正在运行以下查询:
SELECT "foos".*
FROM "foos"
INNER JOIN "bars" ON "foos".bar_id = "bars".id
WHERE (("bars".baz_id = 13266))
ORDER BY "foos"."id" DESC
LIMIT 5 OFFSET 0;
Run Code Online (Sandbox Code Playgroud)
此查询需要很长时间才能运行(Rails在运行时会超时).所有ID都有一个索引.好奇的部分是,如果我删除ORDER BY条款或LIMIT条款,它几乎是瞬间运行.
我假定这两者的存在ORDER BY和LIMIT正在做的PostgreSQL查询规划一些错误的选择.任何人都有任何想法如何解决这个问题?
如果它有帮助,这里是EXPLAIN所有3种情况:
//////// Both ORDER and LIMIT
SELECT "foos".*
FROM "foos"
INNER JOIN "bars" ON "foos".bar_id = "bars".id
WHERE (("bars".baz_id = 13266))
ORDER BY "foos"."id" DESC
LIMIT 5 OFFSET 0;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------
Limit (cost=0.00..16663.44 rows=5 width=663)
-> Nested Loop (cost=0.00..25355084.05 rows=7608 width=663) …Run Code Online (Sandbox Code Playgroud)