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缓存了执行计划。


目录
相关文章
|
2月前
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
285 8
|
7月前
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
7月前
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
7月前
|
SQL Oracle 关系型数据库
解决大小写、保留字与特殊字符问题!Oracle双引号在SQL中的特殊应用
在Oracle数据库开发中,双引号的使用是一个重要但易被忽视的细节。本文全面解析了双引号在SQL中的特殊应用场景,包括解决标识符与保留字冲突、强制保留大小写、支持特殊字符和数字开头标识符等。同时提供了最佳实践建议,帮助开发者规避常见错误,提高代码可维护性和效率。
283 6
|
8月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
|
8月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
|
8月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
本文来自YashanDB官网,介绍如何处理Oracle客户端sql*plus中使用@@调用同级目录SQL脚本的场景。崖山数据库23.2.x.100已支持@@用法,但旧版本可通过Python脚本批量重写SQL文件,将@@替换为绝对路径。文章通过Oracle示例展示了具体用法,并提供Python脚本实现自动化处理,最后调整批处理脚本以适配YashanDB运行环境。
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
529 13
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
348 9