查询执行时间很长

时间:2014-11-17 22:53:55

标签: sql postgresql

我正在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个表:SimulationStatsGroupSimulationStatsSimulationStatsGroup包含1到13 SimulationStatsSimulationStats是一个简单的实体,包含我的应用程序使用的executionTime之类的数值。每个SimulationStatsGroupSimulationStats都有一个名称。

以下是我获得的EXPLAIN ANALYZEhttp://explain.depesz.com/s/auLK

为什么我的查询执行这么长时间?

2 个答案:

答案 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开发人员会注意并尝试在将来的版本中为我们丢弃未引用的列,而不是我们手动编码。

相关问题