我有這樣PostgreSQL的:。真慢ORDER BY與主鍵排序鍵
與下表大小的模型:
+------------------+-------------+
| Table | Records |
+------------------+-------------+
| JOB | 8k |
| DOCUMENT | 150k |
| TRANSLATION_UNIT | 14,5m |
| TRANSLATION | 18,3m |
+------------------+-------------+
現在下面的查詢
select translation.id
from "TRANSLATION" translation
inner join "TRANSLATION_UNIT" unit
on translation.fk_id_translation_unit = unit.id
inner join "DOCUMENT" document
on unit.fk_id_document = document.id
where document.fk_id_job = 11698
order by translation.id asc
limit 50 offset 0
大約需要90 seco nd完成。當我刪除ORDER BY和LIMIT條款,它需要19.5秒。 ANALYZE在執行查詢之前已在所有表上運行。
對於這個特定的查詢,這些記錄滿足條件的數字:
+------------------+-------------+
| Table | Records |
+------------------+-------------+
| JOB | 1 |
| DOCUMENT | 1200 |
| TRANSLATION_UNIT | 210,000 |
| TRANSLATION | 210,000 |
+------------------+-------------+
查詢計劃:
改性用的查詢計劃,而不ORDER BY和LIMIT是here。
數據庫參數:
PostgreSQL 9.2
shared_buffers = 2048MB
effective_cache_size = 4096MB
work_mem = 32MB
Total memory: 32GB
CPU: Intel Xeon X3470 @ 2.93 GHz, 8MB cache
任何人都可以看到什麼是錯此查詢?
UPDATE:Query plan爲無順序相同的查詢BY(但仍與LIMIT條款)。
如何爲Postgre優化器的工作?例如,您可以從您的選擇中進行選擇,並且在沒有優化程序的情況下訂購它,這是兩步選擇? – Paul
只是一個幸運的猜測。你可以嘗試移動連接中的where子句嗎?在這種情況下,只需用'和'替換'where'。 – foibs
@fibibs:那不會有什麼區別。 Postgres優化器足夠聰明,可以檢測到兩個版本都是一樣的。 –