技术开发 频道

带临时表的SQL查询语句的优化方法

  【IT168 原创】故障突发:11号上午,收到系统应用人员的反馈:“销售日报”无法查询出结果,已经等待一个小时,屏幕依然是灰的,而以往该报表2分钟内即可出结果,IT部的同事看一下怎么回事,领导在等报表。我登录数据库,查询当前系统的进程情况下图(2),发现确实有些进程已经运行3600+秒,捕捉出其执行计划,如:下图(3)

  案例(图1,正式库上该报表的运行时长)

带临时表的SQL查询语句的优化方法

  案例(图2,正式库上该报表的SQL语句)

带临时表的SQL查询语句的优化方法

 带临时表的SQL查询语句的优化方法

  案例(图3,正式库上该报表的执行计划)

带临时表的SQL查询语句的优化方法

  定位问题:

  印象中,该报表以前优化过,耗时也就几秒到几十秒,效率算得上是非常高的。观察此执行计划,CBO预估的查到数据非常少,但由于报表的SQL语句中使用上了临时表(TYBBSALEDAILYBD21 ),而临时表的数据在库中是无法查看到的,我也不清楚临时表的数据是如何生成的,因此,无法判断CBO预估的临时表的行数是否准确,该如何下手?

  此时,想起测试环境上,有上月对该库进行RMAN恢复测试后留下的测试库。于是启动测试中间件,让测试中间件指向该测试库,尝试在上面查询该报表,看看运行情况如何?

  运行时观察其执行计划,如:图2

  案例(图2,测试库上的执行计划)

带临时表的SQL查询语句的优化方法

  可以看到,测试库上的执行计划,与正式库的完全不一样,而且在测试库上的查询的效率正常,和以往的一样,几十秒即出结果,显然,问题出在正式库的执行计划上,

0
相关文章