专栏首页杨建荣的学习笔记性能下降的不定时炸弹_过旧的sql_profile(r3笔记第9天)

性能下降的不定时炸弹_过旧的sql_profile(r3笔记第9天)

最近这一周以来,生产环境像是得了重病的病人一样,小问题没有修好,大问题不断。IO的等待极为严重。数据库的负载达到了几十倍,上百倍。 weblogic和tuxedo在很大程度上都受到了影响,导致业务响应极为缓慢。 在排查了中间件部门,数据库,存储,网络,操作系统等各个层面,也发现了存储的一些小问题,问题比较大的就是数据库这边的一个sql语句,每执行一次需要7分多钟,按理说这种类型的语句执行7分钟左右可能不是太大的问题。但是了解到这个sql语句在所有的中间件层面都需要频繁的发送sql请求,比如有20个weblgoic,那么可能就同时会发送20个sql请求,这个问题一下子就变得有些严重了。 更有些让人纳闷的是,通过查看sql语句,发现里面添加了一些hint,这些Hint在认真的校验之后,都没有问题,根据产品线的反馈,这些都是反复验证的最优执行。里面有一个5千多万条数据的表,需要走全表扫描,在Hint里面加了一些指定的处理,都是很合理的处理。 我抓取到top sql以后,查看执行计划就有些纳闷,为什么执行计划和Hint里面的有很大出入,Hint中指定了使用全表扫描,并行,但是生产环境的执行计划却是用了索引,没有使用并行。 反复的验证之后,但是也没留意,自己主观的认为没有走并行可能是资源使用受限,没有多余的并行资源可用了,所以没有走并行,走索引扫描,可能是Oracle认为通过索引扫描的代价更低。 但是自己的认识确实是错了。我显示通过sql monitor得到了对于那个的执行报告,然后生成了一个sql tuning advisor的报告,里面给的两个建议,一个是添加对应的索引,让一些数据的过滤更加高效,这个也需要斟酌,毕竟添加额外的索引会对dml产生一定的影响,可能原有的一些执行计划会受到影响,得不偿失。 另外一个建议就是增加并行。这个地方我就有些纳闷了,本来已经增加了并行,但是似乎没有产生什么效果。 最后查看sql_profile的配置时,自己才恍然大悟。sql语句没有走hint指定的执行计划,很大程度上是因为已经配置了对应的sql_profile,这个sql_profile里面指定了数据的访问需要走索引,不走并行等等。按照问题排查的思路,我们这几个月对没有处理过这个sql语句。最后一查看创建的时间让人大跌眼镜,这个sql_profile是在去年的10月份创建的,那个时候里面的数据要少很多。按照当时的分析和数据量,访问索引可能效率更高,代价更低。但是过了快一年了,结果数据量增加了好几倍,系统的负载也上来了,原来的profiel就产生了负面的影响,本来影响还不明显,慢慢的随着数据量的不断增大,问题越来越严重,导致了隔了一年以后终于爆发了。 所以说过旧的profile真是一个不定式炸弹,在系统的升级过程中,有些执行计划确实要好好斟酌。oracle毕竟没有那么有远见的判断你数据的增长情况,它只是在当前的情况下能分析出最友,代价最低的一些建议。但是需要我们自己来判断。 当然了这个问题的处理也不是一句话就解决的事,我们需要做好充分的准备,首先需要备份原有的profile,万一性能更加糟糕了怎么办,至少我们可以让执行计划不会更加糟糕。恢复回去。 这个时候就可以使用dbms_sqltune里面的几个小功能。 这个功能是创建一个sqlprofiel备份的表,所有的profile的备份数据可以放在这个表中

SQL> exec  DBMS_SQLTUNE.CREATE_STGTAB_SQLPROF(table_name=>'STAGE',schema_name=>'N1');

PL/SQL procedure successfully completed. 使用如下的命令可以直接把当前的profile数据备份到表中

SQL> exec  dbms_sqltune.PACK_STGTAB_SQLPROF(PROFILE_NAME=>'SYS_SQLPROF_01419cd955b40000',STAGING_TABLE_NAME=>'STAGE',STAGING_SCHEMA_OWNER=>'N1');
PL/SQL procedure successfully  completed.

有了这些数据,就可以导入到别的库上或者直接恢复。 当然了在目前的库上我们先不需要这个profiel了,就需要直接删除它。 exec dbms_sqltune.drop_sql_profile('SYS_SQLPROF_01419cd955b40000'); 这样处理之后,就等性能能够有质的飞跃了。

本文分享自微信公众号 - 杨建荣的学习笔记(jianrong-notes),作者:r3笔记第9天

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2014-09-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 浅谈pl/sql (r3笔记第14天)

    关于pl/sql,可能大家熟悉而又陌生,熟悉是因为大家在工作中老是写sql,如果稍微改动一些,加入begin,end和控制结构,就是pl/sql了。:) 今...

    jeanron100
  • awr性能问题排查第一篇(r3笔记第42天)

    对于awr,里面涵盖的内容比较杂,有时候看报告的时候总是不知道该怎么下手。时间长了,可能会有一些阅读习惯或者心得。今天在看大师chris lawson的一篇博文...

    jeanron100
  • 通过shell脚本来查看Undo中资源消耗高的sql(r2笔记88天)

    在查看undo的使用率的时候,在Undo_management为auto的时候,经常会看到undo自己在不断的伸缩扩展,自我调节。 有时候看到Undo收缩的很紧...

    jeanron100
  • 你知道这种开发模式能更好的帮你排错吗?

    很多时候我们在开发一个项目的时候写着写着sql语句报错了?(这里多指使用框架开发,当然也有原声sql语句),之后有时候会扎耳挠腮,看来看去都感觉自己的sql语句...

    思梦php
  • pl sql 查看历史执行过的sql记录

    现在越来越多人用plsql 查询和执行sql,因为该工具很方便,不仅可以执行sql、以及命令窗口,但是呢,有时候我们执行完sql,可能忘记保存或者当时觉得可能不...

    小小鱼儿小小林
  • 使用PHP的PDO_Mysql扩展有效避免sql注入

    首先,什么是sql注入? 用大白话说就是:当一个人在访问你的应用时,需要输入,他的输入是一些特殊的字符,你没有对输入进行过滤处理导致他的输入改变了你的sql语...

    luxixing
  • JDBC系列:(3)使用Prepared

    py3study
  • Oracle AWR 阙值影响历史执行计划

          最近有网友提到为什么在dba_hist_sql_plan中无法查看到sql语句的历史执行计划,对于这个问题是由于缺省情况下,Oracle 设定的阙值...

    Leshami
  • sql格式化工具

    该工具支持oracle、mysql、sql server等关系型数据库,能让你看到sql美化后的清晰的结构,可运用于对复杂SQL语句的分析或者是程序代码优化上,...

    ixiaoyang8
  • Mysql Workbench建模导入MySQL中

    用户1258909

扫码关注云+社区

领取腾讯云代金券