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 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
555 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
1月前
|
SQL 监控 Oracle
Oracle SQL性能优化全面指南
在数据库管理领域,Oracle SQL性能优化是确保数据库高效运行和数据查询速度的关键
|
1月前
|
SQL 存储 Oracle
Oracle数据库SQL语句详解与应用指南
在数字化时代,数据库已成为各类企业和组织不可或缺的核心组件。Oracle数据库作为业界领先的数据库管理系统之一,广泛应用于各种业务场景。掌握Oracle数据库的SQL语句是数据库管理员、开发人员及运维人员的基本技能。本文将详细介绍Oracle数据库SQL语句的基本概念、语法、应用及最佳实践。一、Or
56 3
|
1月前
|
SQL Oracle 关系型数据库
Oracle SQL:了解执行计划和性能调优
Oracle SQL:了解执行计划和性能调优
53 1
|
2月前
|
SQL 分布式计算 数据库
SQL调优总结
数据库表的规范化和反规范化设计,设计合适的字段数据类型……
45 8
|
3月前
|
Java XML Maven
跨越时代的飞跃:Struts 2 升级秘籍——从旧版本无缝迁移到最新版,焕发应用新生!
【8月更文挑战第31天】随着软件技术的发展,Struts 2 框架也在不断更新。本文通过具体案例指导开发者如何从旧版平滑升级到 Struts 2.6.x。首先更新 `pom.xml` 中的依赖版本,并执行 `mvn clean install`。接着检查 `struts.xml` 配置,确保符合新版本要求,调整包扫描器等设置。审查 Action 类及其注解,检查配置文件中的弃用项及插件。更新自定义拦截器实现,并验证日志配置。最后,通过一系列测试确保升级后的系统正常运行。通过这些步骤,可以顺利完成 Struts 2 的版本升级,提升应用的安全性和性能。
213 0
|
3月前
|
Java 开发者 前端开发
Struts 2、Spring MVC、Play Framework 上演巅峰之战,Web 开发的未来何去何从?
【8月更文挑战第31天】在Web应用开发中,Struts 2框架因强大功能和灵活配置备受青睐,但开发者常遇配置错误、类型转换失败、标签属性设置不当及异常处理等问题。本文通过实例解析常见难题与解决方案,如配置文件中遗漏`result`元素致页面跳转失败、日期格式不匹配需自定义转换器、`<s:checkbox>`标签缺少`label`属性致显示不全及Action中未捕获异常影响用户体验等,助您有效应对挑战。
89 0
|
3月前
|
SQL 监控 关系型数据库
SQL性能监控与调优工具的神奇之处:如何用最佳实践选择最适合你的那一个,让你的数据库飞起来?
【8月更文挑战第31天】在现代软件开发中,数据库性能监控与调优对应用稳定性至关重要。本文对比了数据库内置工具、第三方工具及云服务工具等几种常用SQL性能监控与调优工具,并通过示例代码展示了如何利用MySQL的EXPLAIN功能分析查询性能。选择最适合的工具需综合考虑功能需求、数据库类型及成本预算等因素。遵循了解工具功能、试用工具及定期维护工具等最佳实践,可帮助开发者更高效地管理和优化数据库性能,迎接未来软件开发中的挑战与机遇。
56 0
|
3月前
|
SQL 关系型数据库 MySQL
SQL性能调优的神奇之处:如何用优化技巧让你的数据库查询飞起来,实现秒级响应?
【8月更文挑战第31天】在现代软件开发中,数据库性能至关重要。本文通过一个实战案例,展示了从慢查询到秒级响应的全过程。通过对查询的详细分析与优化,包括创建索引、改进查询语句及数据类型选择等措施,最终显著提升了性能。文章还提供了示例代码及最佳实践建议,帮助读者掌握SQL性能调优的核心技巧。
218 0