我有一个像这样的模型
使用以下表格大小:
+------------------+-------------+
| 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秒才能完成。当我删除ORDER BY和LIMIT子句时,只需要19.5秒。在执行查询之前,ANALYZE已在所有表上运行。
对于这个特定的查询,满足条件的记录数量如下:
+------------------+-------------+
| Table | Records |
+------------------+-------------+
| JOB | 1 |
| DOCUMENT | 1200 |
| TRANSLATION_UNIT | 210,000 |
| TRANSLATION | 210,000 |
+------------------+-------------+
查询计划:
没有ORDER BY和LIMIT的修改查询计划在这里。
数据库参数:
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
有人能看出这个查询有什么问题吗?
更新: 没有ORDER BY的相同查询的查询计划(但仍带有LIMIT子句)。
order by
的执行计划(那个快的)?最好上传到http://explain.depesz.com,这样更易读。 - user330315