客户报告,
当他从 Oracle 11.1.0.7 ,迁移到云环境,并且升级到12.1.0.2。
运行客户的应用程序测试,发现比以前更慢了。

从AWR report 的"Top 10 Foreground Events by Total Wait Time"和"Wait Classes by Total Wait Time"等信息,
可以看到 CPU 值升高了。

初步思考,怀疑由于环境的不同,导致性能不同。但是客户说,这两个环境的CPU数目/内存大小等各方面情况都完全一样。
那么就的考虑其他的原因了。

迁移前的环境和迁移后的环境对比,从AWR report 中,可以看到,迁移后的 "Hard parse"  的比例明显偏高。

***迁移前
Load Profile
Per Second Per Transaction Per Exec Per Call
DB Time(s): 1.1 0.0 0.00 0.00
DB CPU(s): 0.3 0.0 0.00 0.00
Parses: 158.3 4.8
Hard parses: 8.8 0.3 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Executes: 620.2 18.2

***迁移后
Load Profile
Per Second Per Transaction Per Exec Per Call
DB Time(s): 0.8 0.0 0.00 0.00
DB CPU(s): 0.6 0.0 0.00 0.00
Parses (SQL): 375.8 14.7
Hard parses (SQL): 75.2 3.0 <<<<<<<<<<<<<<<<<<<<<<<<< hard parse 大幅度增加
Executes (SQL): 702.7 28.3

客户报告,在新环境里,设置了 对 应用中的所有的 SQL文 都追加了 类似于
"SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.1.0.7') ORDERED INDEX(T0001 T0001_001) NO_USE_HASH(FBM10) */" 的hint之后,
发现性能基本回到了迁移前的水平。

从这一点来考虑,OPTIMIZER_FEATURES_ENABLE,可能是影响到了 optimizer_adaptive_features 功能。这一功能会在SQL文执行
的时候,动态地判断有没有更好的执行计划。而很可能对客户程序的一部分SQL文,反而动态调整执行计划产生了大量的Hard Parse,
整体上拖延了执行时间。

客户也怀疑 是 文档 2312911.1 所提到的 12.1 的 optimizer_adaptive_features 功能不够完善导致出现问题。文档 2312911.1
提及,12.1 的 optimizer_adaptive_features 功能不够完善,可以特殊处理,以达到12.2的效果(12.2中, optimizer_adaptive_
features 有所改善,被拆分成为了两个参数)。

那么,到底是不是这样呢,客户希望进一步进行分析调查。

从拿到了迁移前后的AWR来对比,发现了有趣的状况:实际上从Top N SQL来看,迁移前的SQL文,迁移后执行时间其实都大幅度缩短了。

***迁移前環境
    ========================
    SQL ordered by Elapsed Time
       Resources reported for PL/SQL code includes the resources used by all SQL statements called by the code.
       % Total DB Time is the Elapsed Time of the SQL statement divided into the Total Database Time multiplied by 100
       Total DB Time (s): 2,597  
       Captured SQL account for 58.8% of Total  <<<<<<<<<<<<Top 10 的SQL文,占据了整体执行时间的 59%(1532秒)
       Total DB Time (s): 2,597
       Captured PL/SQL account for 0.3% of Total
    ========================

***迁移后(未追加 OPTIMIZER_FEATURES_ENABLE hint 的时候)
    ========================
    SQL ordered by Elapsed Time  ★
       Resources reported for PL/SQL code includes the resources used by all SQL statements called by the code.
       % Total DB Time is the Elapsed Time of the SQL statement divided into the Total Database Time multiplied by 100
       %Total - Elapsed Time as a percentage of Total DB time
       %CPU - CPU Time as a percentage of Elapsed Time
       %IO - User I/O Time as a percentage of Elapsed Time
       Captured SQL account for 27.9% of Total DB Time (s): 1,771  <<<<<<<<<<<<Top 10 的SQL文,占据了整体执行时间的 28%(500秒)
       Captured PL/SQL account for 1.3% of Total DB Time (s): 1,771
    ========================

从具体的top 10 SQL文执行时间上,也可以看出来:

++++++++++++++++++++++++++++++++++++++++++++++
    2ac8g6tagg67x  迁移后>>17,122 回执行  CPU Time 13.27s、Elapsed Time 139.03s  
                           迁移前>>21,018 回执行  CPU Time 16s、Elapsed Time 839s

5mt3dyz3r6af8  迁移后>>425 回执行  CPU Time 25.28s、Elapsed Time 33.10s
                          迁移前>>509回执行  CPU Time 44s、Elapsed Time 105s

7tjhsnk6ruw6m  迁移后>>165 回执行  CPU Time 16.67s、Elapsed Time 21.69s
                           迁移前>>165 回执行  CPU Time 25s、Elapsed Time 50s

......

baq2zs9gns3co  迁移后>>51,730 回执行  CPU Time 9.92s、Elapsed Time 16.57s
                           迁移前>>67,66 4回执行  CPU Time 10s、Elapsed Time 26s
    ++++++++++++++++++++++++++++++++++++++++++++++

那么,问题到底处在哪里呢? 我的猜测是: 虽然TopN 那些SQL文的执行时间减小了。但是还有很多执行很短暂的SQL文,由于动态执行
计划调整,导致事件增加了。

这也很容易理解:

如果一条SQL语句的执行时间原本是200ms,如果动态执行计划调整花5ms,使得因执行更好的执行计划而较少了执行时间20ms,总体上来说
就是赚到了。

可是如果你一条小SQL执行语句,本来执行时间才20ms,如果动态执行计划调整花5ms,使得因执行更好的执行计划而较少了执行时间2ms,
反而执行时间增加了。

如果这条小SQL执行语句,反复多次执行呢?那问题就恶化了。

就好比:虽说磨刀不误砍柴功,但是如果每砍一个小树杈,都要磨一次刀,那是不是有点浪费时间啊。

对于这个推测,客户仍然想要了解更详细的细节,那么好吧,我们来看看ASH的情况:

迁移前

"In Hard Parse" ==> 15 行     "In Hard Parse" 的比例:37.5%
2018/03/12 15:26:36 --->  2018/03/12 15:37:25.693000000
SQL_ID: 30 个

迁移后

"In Hard Parse" ==> 252 行     "In Hard Parse" 的比例:76.6%
2018/03/20 11:33:50 --->  2018/03/20 12:25:58.591000000
SQL_ID: 292 个

迁移后的总体时间不但大幅度延长了,而且ASH中统计出来的sql_id 明显增多。所以可以推测很多原本执行时间很短的sql语句,因为执行计划
调整的原因,话费时间进行了 Hard Parse,所以当ASH采样的时候,因为没有执行完毕,更多的出现在ASH履历中。

那么,作为结论, 12c的执行计划调整并不是适合所有sql文的,对效果不佳的语句,不妨添加 OPTIMIZER_FEATURES_ENABLE 进行微调。

[Oracle维护工程师手记]一次升级后运行变慢的分析的更多相关文章

  1. [Oracle维护工程师手记]Data Guard Broker中改属性是否需要两侧分别执行?

    Data Guard Broker中改属性是否需要两侧分别执行? Data Guard Broker有一些属性,可以通过 show configuration 看到.我有时会想,这些个属性,是否是分别 ...

  2. [Oracle维护工程师手记]为什么flashback 的时候既需要 flashback log ,又需要 archive log?

    为什么flashback 的时候既需要 flashback log ,又需要 archive log 呢? 如果数据库的活动不是很频繁,可以看到,其flashback log 是比较小的.那么是通过怎 ...

  3. [Oracle维护工程师手记]两表结合的MVIEW的告诉刷新

    对两表结合查询建立MVIEW,进行MVIEW的的高速刷新失败,如何处理? 例如: SQL> drop user u1 cascade; User dropped. SQL> grant d ...

  4. 转://Oracle数据库升级后保障SQL性能退化浅谈

    一.数据库升级后保障手段 为了保障从10.2.0.4版本升级到11.2.0.4版本更加平稳,我们事先采用了oracle性能分析器(SQL Performance Analyzer)来预测数据库的关键S ...

  5. [Oracle运维工程师手记] 如何从trace 文件,判断是否执行了并行

    [Oracle运维工程师手记系列]如何从trace 文件,判断是否执行了并行 客户说,明明指定了并行的hint,OEM 却报说没有并行,并且提供了画面. 客户的SQL文长这样: INSERT/*+ p ...

  6. CENTOS 6.4 安装oracle 10g,手工建库及升级到10.2.0.5

    一. 数据库软件安装 参照官方手册 1.安装rpm包 注这里的yum直接用163的yum yum -y install binutils compat-libstdc++-33 compat-libs ...

  7. Oracle维护:每天的工作

    Oracle维护:每天的工作 检查数据库状态 确认所有的INSTANCE状态以及listener状态正常,登陆到所有数据库或例程,检测ORACLE后台进程: $ ps –ef|grep ora $ l ...

  8. oracle 11.2.0.1.0 升级 11.2.0.4.0 并 patch 到11.2.0.4.7

    升级步骤: (1)    备份数据库 (2)    运行patchset,升级oracle 软件 (3)    准备新的ORACLE_HOME (4)    运行dbua 或者脚本升级实例 (5)   ...

  9. 关于kali2.0rolling中metasploit升级后无法启动问题的解决总结

    最近在学习metasploit的使用,文中提到可以使用msfupdate命令来对metasploit的payload.exploit等进行升级,我就试了一下,没想到升级过程并不麻烦,但升级后却出现了无 ...

随机推荐

  1. 如何使用kafka增加topic的备份数量,让业务更上一层楼

    本文由云+社区发表 一.困难点 建立topic的时候,可以通过指定参数 --replication-factor 设置备份数量.但是,一旦完成建立topic,则无法通过kafka-topic.sh 或 ...

  2. 痞子衡嵌入式:ARM Cortex-M文件那些事(7)- 反汇编文件(.s/.lst/.dump)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式开发里的反汇编文件(.s, .lst, .dump). 痞子衡在第四.五.六节课分别介绍了编译器/链接器生成的3种output文件( ...

  3. Mybatis学习(七)————— mybatis的逆向工程的配置详解

    一.什么是逆向工程? 简单点说,就是通过数据库中的单表,自动生成java代码. Mybatis官方提供了逆向工程,可以针对单表自动生成mybatis代码(mapper.java\mapper.xml\ ...

  4. [MySQL] mysql 的行级显式锁定和悲观锁

    隐式和显式锁定:1.innodb是两阶段锁定协议,隐式锁定比如在事务的执行过程中.会进行锁定,锁只有在commit或rollback的时候,才会同时被释放2.特定的语句进行显式锁定 select .. ...

  5. 测试一波SpringBoot的HTTP吞吐量

    本来,其实就我个人而言现在很少去弄性能这一块的阵地了,主要在做设计与架构,不过前几天刚刚关注公众号的罗哥给我抛了关于性能方面的问题. 一个问题立马引起了我的兴趣,太久没弄性能方面的事情了,所以在隔天有 ...

  6. Spring中BeanFactory的对象注册与依赖绑定方式

    概念 BeanFactory是spring的基础类型IOC容器,提供完整的IOC服务支持 默认采用延迟初始化策略,当客户端对象访问受管对象时,才对其进行初始化和依赖注入 理解 BeanFactory将 ...

  7. input中只能写入数字int、float

    input 属性 type="number" <input type="number" min="1" max="100&q ...

  8. 全球排名第一的免费开源ERP Odoo 12产品上海发布会报名开始

    Odoo V12 产品上海发布会暨企业数字化转型论坛 点击进入活动报名通道 高成本的软件开发,耗时的系统安装,繁琐的操作培训… 这一系列问题都是企业数字化管理的痛点, "软件"成为 ...

  9. weblogic Patch

    How to Apply WLS Patch on Weblogic Integrated with OEM Getting "Main Thread" Java.lang.Out ...

  10. 从.Net到Java学习第十二篇——SpringBoot+JPA提供跨域接口

    从.Net到Java学习系列目录 最近又撸了半个月的前端代码,做app离线存储,然后又花了一周去将过去的wcf项目转webapi,java又被落下了,总感觉我特么像斗地主中的癞子牌,变来变去..... ...