【发布时间】:2014-11-17 22:53:54
【问题描述】:
我正在 2GB RAM VPS 上执行 Postgresql 数据库。
设置如下:
max_connections = 100
work_mem=1MB
shared_buffers=128MB
我正在执行一个包含一百万行的非常简单的查询:
SELECT s.executionTime, g.date, s.name
FROM SimulationStatsGroup g
LEFT JOIN SimulationStats s ON s.group_id = g.id
WHERE g.name = 'general'
ORDER BY g.date DESC
我有 2 张桌子:SimulationStatsGroup 和 SimulationStats。 SimulationStatsGroup 包含 1 到 13 个 SimulationStats。 SimulationStats 是一个简单的实体,其中包含我的应用程序使用的 executionTime 等数值。每个SimulationStatsGroup 和SimulationStats 都有一个名称。
这是我得到的EXPLAIN ANALYZE:http://explain.depesz.com/s/auLK
为什么我的查询执行时间这么长?
【问题讨论】:
-
原因是“排序方法:外部合并磁盘:140784kB”。尝试为您的会话增加
work_mem并检查对查询的改进程度。虽然 2GB RAM 对于数据库服务器来说确实很小(我认为 Oracle 会拒绝从那个开始......) -
您正在返回超过一百万行。你为什么抱怨执行时间?大部分时间可能只是返回数据(排序没有帮助)。
-
你有关于 SimulationStats(group_id) 和 SimulationStatsGroup(id) 的索引吗?正如其他人所指出的,无论如何,对一百万条记录进行排序肯定需要时间。
-
您确定 EXPLAIN ANALYZE 的结果来自上述查询吗? ORDER BY 看起来有点不同。 g.date 上的索引可以帮助加快排序
-
@a_horse_with_no_name 10MB work_mem 仍然需要很长时间
标签: sql postgresql