我今天反对一种新的查询优化问题。
我的查询是:
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毫秒来确定查询计划并执行。两台服务器之间的主要区别在于数据量,在所有表中存在问题的数据中有两倍的数据。
那么我应该考虑什么才能理解什么会减慢我的执行计划计算?
答案 0 :(得分:0)
看起来我们已经定义了一个太大的全球统计目标。此值是定义查询计划所需的强时间链接。
降低价值已解决了我们的问题。