ORACLE SQL调优之'PLAN_TABLE' is old version

简介:   在为国投做SQL调优时,他们开发说不要动现在的SQL,调整一下执行计划即可,即查询某个表时执行特定的执行计划。乍一听,我是吓了一跳!  由于他们开发不让动SQL结构(该SQL经过PLSQL优化后有500多行,其是2层嵌套递归查询,外边一个SQL如图1-2,外层SQL的每一个列是一个子查询如下图1-1,递归子查询有32个),所以只能从SQL涉及的表、索引下手,查找问题的具体原因及解决办法。
  在为国投做SQL调优时,他们开发说不要动现在的SQL,调整一下执行计划即可,即查询某个表时执行特定的执行计划。乍一听,我是吓了一跳!
 由于他们开发不让动SQL 结构该SQL经过PLSQL优化后有500多行,其是2层嵌套递归查询,外边一个SQL如图1-2 ,外层SQL的每一个列是一个子查询如下图1-1,递归子查询有32个),所以只能从SQL涉及的表、索引下手,查找问题的具体原因及解决办法。我的做法是,先查看了SQL涉及的表的统计信息,问题SQL涉及了8张表(最大的表有300M左右,小表只有几M大小),表的统计信息距离现在有3个月。通过与他们维护人员沟通,对问题SQL涉及的8张表进行了统计信息更新;然后在他们的测试环境中测试问题SQL,发现SQL执行的速度比之前的20多分钟缩减到15分钟,速度有提升但是不明显。然后,在不改变SQL结构的前提下,我做了如下调整(由于SQL涉及薪水查询,比较敏感,这里只能大概给出处理涉及的部分):
 
  图 1-1 递归查询部分中添加的hint
 
 图 1-2 外层查询中添加的hint
 我的处理依据是:执行该sql生成的执行计划中有比较多的全表扫描(全表扫描的表是同一个表,大小有12M,全表扫的次数有18次之多),根据提示的全表扫描,又查询了谓词涉及的列中是否有索引,查询到谓词涉及的列中有索引但是执行计划没有走而是全表扫描。先不计较添加hint是否有利于执行速度的提高,我就试了一下。添加hint后,SQL的执行速度果然有提高,在他们的测试库中执行时间从15分钟减少到3分多钟,有明显的提高了。但是,在他们的生产库中进行优化实施后,发现SQL的执行速度不但没有改善反而严重下降了,从原来的20多分钟到3个多小时,简直让人发疯。
 此时,我意识到,他们运行SQL是通过ORACLE DISCOVER运行的,执行后生成报表,就是薪资表,但是他们开发坚持该SQL执行客户端没问题。我只能在他们的生产库中生成执行计划查找原因,经过与测试环境中调整后的SQL执行计划对比发现个很严重的问题,如下图所示:

 执行计划提示:当前SQL执行使用的执行计划是老版本,也就是说我们做的统计信息更新及hint的设置根本没任何作用,这就是导致SQL问题慢的具体原因了(也是他们开发说的让调整SQL执行计划,但是又不能改变SQL的结构)。
 接下来,我做了如下步骤的操作:
1、业务用户登录数据库服务器
2、SQL>set autot on
   SQL>set timing on
3、执行速度慢的SQL
4、观察执行计划尾部是否有如下提示:
   Note -- plan table is old version
5、在4有提示的情况下(建议在服务器端sqlplus中执行)
  SQL>drop table plan_table;  --业务用户执行
  SQL>@?/rdbms/admin/utlxplan; --具有DBA权限的用户(SYS)执行
6、再次重复执行速度慢的SQL3-5次,观察SQL速度是否有所改善
 经过调整后,再次运行SQL,发现添加hint的SQL执行时间是3:15s,不添加hint的SQL执行时间是6::35s;终于,生产库的执行时间也能从20多分钟减少到3分多钟,达到了他们开发的基本要求了。总结:问题SQL执行慢的原因有3个,一是表的统计信息没有及时更新,二是表的索引没有被用上,三是plan_table缓存了执行计划。


目录
相关文章
|
4天前
|
SQL 存储 Oracle
Oracle的PL/SQL定义变量和常量:数据的稳定与灵动
【4月更文挑战第19天】在Oracle PL/SQL中,变量和常量扮演着数据存储的关键角色。变量是可变的“魔术盒”,用于存储程序运行时的动态数据,通过`DECLARE`定义,可在循环和条件判断中体现其灵活性。常量则是不可变的“固定牌”,一旦设定值便保持不变,用`CONSTANT`声明,提供程序稳定性和易维护性。通过 `%TYPE`、`NOT NULL`等特性,可以更高效地管理和控制变量与常量,提升代码质量。善用两者,能优化PL/SQL程序的结构和性能。
|
4天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标属性:数据的“导航仪”与“仪表盘”
【4月更文挑战第19天】Oracle PL/SQL游标属性如同车辆的导航仪和仪表盘,提供丰富信息和控制。 `%FOUND`和`%NOTFOUND`指示数据读取状态,`%ROWCOUNT`记录处理行数,`%ISOPEN`显示游标状态。还有`%BULK_ROWCOUNT`和`%BULK_EXCEPTIONS`增强处理灵活性。通过实例展示了如何在数据处理中利用这些属性监控和控制流程,提高效率和准确性。掌握游标属性是提升数据处理能力的关键。
|
4天前
|
SQL XML 前端开发
sql 性能优化基于explain调优(二)
sql 性能优化基于explain调优(二)
11 0
|
4天前
|
SQL Oracle 安全
Oracle的PL/SQL循环语句:数据的“旋转木马”与“无限之旅”
【4月更文挑战第19天】Oracle PL/SQL中的循环语句(LOOP、EXIT WHEN、FOR、WHILE)是处理数据的关键工具,用于批量操作、报表生成和复杂业务逻辑。LOOP提供无限循环,可通过EXIT WHEN设定退出条件;FOR循环适用于固定次数迭代,WHILE循环基于条件判断执行。有效使用循环能提高效率,但需注意避免无限循环和优化大数据处理性能。掌握循环语句,将使数据处理更加高效和便捷。
|
4天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL条件控制:数据的“红绿灯”与“分岔路”
【4月更文挑战第19天】在Oracle PL/SQL中,IF语句与CASE语句扮演着数据流程控制的关键角色。IF语句如红绿灯,依据条件决定程序执行路径;ELSE和ELSIF提供多分支逻辑。CASE语句则是分岔路,按表达式值选择执行路径。这些条件控制语句在数据验证、错误处理和业务逻辑中不可或缺,通过巧妙运用能实现高效程序逻辑,保障数据正确流转,支持企业业务发展。理解并熟练掌握这些语句的使用是成为合格数据管理员的重要一环。
|
4天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL表达式:数据的魔法公式
【4月更文挑战第19天】探索Oracle PL/SQL表达式,体验数据的魔法公式。表达式结合常量、变量、运算符和函数,用于数据运算与转换。算术运算符处理数值计算,比较运算符执行数据比较,内置函数如TO_CHAR、ROUND和SUBSTR提供多样化操作。条件表达式如CASE和NULLIF实现灵活逻辑判断。广泛应用于SQL查询和PL/SQL程序,助你驾驭数据,揭示其背后的规律与秘密,成为数据魔法师。
|
SQL Oracle 关系型数据库
Oracle SQL优化之多表连接
Oracle SQL优化之多表连接
431 0
Oracle SQL优化之多表连接
|
SQL 关系型数据库 Oracle
ORACLE SQL优化之ORA-03150&ORA-02055&ORA-02063
                                                                                                             >   
4764 0
|
SQL 存储 Oracle
Oracle SQL语句优化方法总结
  1、SQL语句尽量用大写的   因为oracle总是先解析SQL语句,把小写的字母转换成大写的再执行。   2、使用表的别名   当在SQL语句中连接多个表时, 尽量使用表的别名并把别名前缀于每个列上。这样一来,   就可以减少解析的时间并减少那些由列歧义引起的语法错误。   3、选择最有效率的表名顺序(只在基于规则的优化器(RBO)中有效)
167 0
|
SQL Oracle 关系型数据库

推荐镜像

更多