【发布时间】:2013-11-15 04:52:28
【问题描述】:
我有一个这样的模型
具有以下表格大小:
+------------------+-------------+
| 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的修改查询计划为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 用于不带 ORDER BY 的同一查询(但仍带有 LIMIT 子句)。
【问题讨论】:
-
优化器如何为 Postgre 工作?例如,您可以从您的选择中进行选择,然后在没有优化器的情况下订购它吗?
-
只是一个幸运的猜测。您可以尝试在连接中移动 where 子句吗?在这种情况下,只需将单词
where替换为and。 -
@foibs:这不会有任何区别。 Postgres 优化器足够聪明,可以检测到两个版本是否相同。
-
@twoflower:您能否也发布执行计划没有
order by(那个很快)?理想情况下将其上传到explain.depesz.com,这样它们的可读性会更高。 -
@foibs 结果一模一样。
标签: sql postgresql postgresql-performance