客户报告,
当他从 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. eclipse 创建maven 项目 动态web工程完整示例

    需求表均同springmvc案例 此处只是使用maven 注意,以下所有需要建立在你的eclipse等已经集成配置好了maven了,说白了就是新建项目的时候已经可以找到maven了 没有的话需要安装m ...

  2. Java中的定时任务

    现代的应用程序早已不是以前的那些由简单的增删改查拼凑而成的程序了,高复杂性早已是标配,而任务的定时调度与执行也是对程序的基本要求了. 很多业务需求的实现都离不开定时任务,例如,每月一号,移动将清空你上 ...

  3. Linux基础命令第一天

    一.命令行bash基本操作 1,shell 用户不能直接操作内核,所以用户操作通过shell传递给内核,Linux下叫shell,就相当于Windows下的cmd shell分为两种: GUI:图形界 ...

  4. [java]static关键字的四种用法

    在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们先来了解一下stat ...

  5. arcgis 10.0中的server报错说工作站服务没有打开

    大家好! 写这篇文章其实我也不知道该不该写,感觉问题其实也不是自己解决的,但是这个问题困恼了我2天,我还将arcgis10.0重装了一次. 下面也不多说了,主要是由于公司的需求,将自己的arcgis1 ...

  6. python学习笔记(六)、类

    Python与java.c++等都被视为一种面向对象的语言.通过创建自定义类,用于处理各种业务逻辑.面向对象有封装.继承.多态三个特征,这也是面子对象语言的通用特征. 1 封装 封装,是值向外部隐藏内 ...

  7. 表单提交前,判断webuploader是否上传

    function busUpLoadImg(postUrl,id) { .......//省略部分不用修改 uploader.on('uploadSuccess', function(file) { ...

  8. TS学习随笔(七)->声明文件

    now我们来看一看TS怎么声明文件, 在JS里面我们经常会使用各种第三方类库,引入方式也不太相同,常见的就是在HTML中通过script标签引入,然后就可以使用全局变量$或者jQuery了 我们通常这 ...

  9. 驰骋工作流引擎JFlow与activiti的对比之4种包含多实例的模式

    1. 无同步的多实例(MIwithout) 在流程中,一个活动可以激活多个实例,每个实例相互独立,并不需要在后面进行同步. 例子:比如用户购买了N本书,于是后续的支付账单.更新客户可以以本书为单位各自 ...

  10. 使用 WeihanLi.Npoi 操作 CSV

    使用 WeihanLi.Npoi 操作 CSV Intro 最近发现 csv 文件在很多情况下都在使用,而且经过大致了解,csv 格式简单,相比 excel 文件要小很多,读取也很是方便,而且也很通用 ...