我有一个这样的模型
具有以下表格大小:
+------------------+-------------+
| 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 seconds。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
谁能看到这个查询有什么问题?
UPDATE:不带ORDER BY的同一查询的查询计划(但仍带有LIMIT子句)。