什么可以证明长期运行EXPLAIN查询(postgres)?

时间:2013-04-05 07:07:14

标签: sql postgresql

我今天反对一种新的查询优化问题。

我的查询是:

SELECT *
 FROM sanrss
 LEFT JOIN sanrum  ON sanrum.sanrum___rforefide = sanrss.sanrss___rforefide AND     sanrum.sanrum___rfovsnide = sanrss.sanrss___rfovsnide AND sanrum.sanrum___sanrsside = sanrss.sanrsside
LEFT JOIN sanact  ON sanact.sanact___rforefide = sanrum.sanrum___rforefide AND sanact.sanact___rfovsnide = sanrum.sanrum___rfovsnide AND sanact.sanact___sanrsside = sanrum.sanrum___sanrsside AND sanact.sanact___sanrumide = sanrum.sanrumide AND sanact.sanact___sanrumide   IS NOT NULL AND sanact.sanact___rsanopide='CCAM'
INNER JOIN saneds  ON sanrss.sanrss___rforefide = saneds.saneds___rforefide AND sanrss.sanrss___rfovsnide = saneds.saneds___rfovsnide AND sanrss.sanrss___sanedside = saneds.sanedside
INNER JOIN sandia ON (sandia___rforefide, sandia___rfovsnide, sandia___sanrsside, sandia___sanrumide, sandiasig) = (sanrum___rforefide, sanrum___rfovsnide, sanrum___sanrsside, sanrumide, 1)
INNER JOIN rsaidp  ON saneds.saneds___rforefide = rsaidp.rsaidp___rforefide AND saneds.saneds___rsaidpide = rsaidp.rsaidpide
  WHERE sanrss.sanrss___rforefide =  'CHUL'  AND sanrss.sanrss___rfovsnide =  '201303_prov'  AND sanrss.sanrssdtf >=  '2013-01-01 00:00:00.0'  AND sanrss.sanrssdtf <=  '2013-03-31 23:59:59.999'
  and sanrss.sanrsside = '7801512' 

这不是真的*,而是选择了300个字段。

我们的服务器之一速度很慢,但另一个服务器没有,所以我对它进行了解释来确定执行计划,这个给我一个0.5毫秒的总运行时间! 但是解释分析的实际总工作时间是3.6秒。

所以我试图只准备请求,这是一个意识到只有查询计划的计算是导致巨大延迟的原因。

我试图切换GEQO的一些会话参数(努力1,努力10,GEQO去激活),对执行时间没有影响。 在对查询的所有表进行统计计算后,计算时间降至2.4秒。

奇怪的是,在较慢的服务器(相同的CPU和主板,但没有ssd存储)上,具有相同参数的完全相同的查询仅花费15毫秒来确定查询计划并执行。两台服务器之间的主要区别在于数据量,在所有表中存在问题的数据中有两倍的数据。

那么我应该考虑什么才能理解什么会减慢我的执行计划计算?

1 个答案:

答案 0 :(得分:0)

看起来我们已经定义了一个太大的全球统计目标。此值是定义查询计划所需的强时间链接。

降低价值已解决了我们的问题。