當我添加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