我正在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
为什么我的查询执行这么长时间?
答案 0 :(得分:1)
在SimulationStats(group_id)和SimulationStatsGroup(id)上创建索引。
答案 1 :(得分:0)
在解释计划中的排序(步骤#2)中,看起来数据库要么拖着未引用的列(非最佳)和/或按它们排序(ouch)。老实说,我不会在Postgres上工作,所以这只是一个有根据的猜测。数据库引擎可能不够智能,无法在流程早期丢弃未引用的列。我尝试使用这个SQL来推动数据库引擎在进行排序之前丢弃未引用的列,并且您可能会看到显着的运行时改进:
SELECT s.executionTime, g.date, s.name
FROM ( select id, date from SimulationStatsGroup WHERE g.name = 'general') as g
LEFT JOIN ( select s.group_id, s.name, s.executionTime from SimulationStats ) as s
ON s.group_id = g.id
ORDER BY g.date DESC
如果此版本显示运行时改进,请运行另一个说明,并告诉我们排序步骤中的列列表是否更少。如果是这样,我的预感可能是正确的。如果正确,希望Postgres开发人员会注意并尝试在将来的版本中为我们丢弃未引用的列,而不是我们手动编码。