通过shell脚本来得到不稳定的执行计划(r4笔记第40天)

生产系统中总是可能碰到各种各样的sql问题,其中大部分问题都和执行计划有关,执行计划出现问题有很多原因导致,比如统计信息过旧,比如数据的分布极不均匀等等都会导致执行计划出现很大的偏差。可能有的sql语句在一周时间内,有一天执行只需要5秒,过了几天之后却需要几个小时,这种执行计划时需要格外重视的,这种问题目前oracle官方没有提供很有效的工具,但是oracle内部却已经提供了很多丰富的数据,完全可以基于这些信息来甄别,oracle专家 kerry osborne就在他的博客中分享了一个脚本,就是专门来甄别这些不稳定的执行计划,如果需要下载可以直接从以下链接得到。 http://kerryosborne.oracle-guy.com/scripts/unstable_plans.sql 我对这个脚本进行了包装,直接包装在shell里面,直接运行脚本即可。 输入参数可以灵活指定标准方差,我简单对标准方差做一个解释, 比如有两组同学,每组三个同学,第一组同学的成绩为69 70 71, 平均成绩为70分。第二组为60,70,80,平均成绩也为70分。 虽然平均成绩相同,标准方差却不同,标准方差就是来统计数据的离散程度。 比如第一组的同学,假设标准方差为a,则a^2=(69-70)^2+(70-70)^2+(71-70)^2)/3=0.67 第二组同学,标准方差为a^2=((60-70)^2+(70-70)^2+(80-70)^2)/3=67 得出的标准方差差别就是这么大,个人感觉就是把数据的差别放大了,感觉还是挺实用的。 脚本如下:

sqlplus -s $DB_CONN_STR@$SH_DB_SID <<EOF
set lines 155
col execs for 999,999,999
col min_etime for 999,999.99
col max_etime for 999,999.99
col avg_etime for 999,999.999
col avg_lio for 999,999,999.9
col norm_stddev for 999,999.9999
col begin_interval_time for a30
col node for 99999
break on plan_hash_value on startup_time skip 1
select * from (
select sql_id, sum(execs), min(avg_etime) min_etime, max(avg_etime) max_etime, stddev_etime/min(avg_etime) norm_stddev
from (
select sql_id, plan_hash_value, execs, avg_etime,
stddev(avg_etime) over (partition by sql_id) stddev_etime
from (
select sql_id, plan_hash_value,
sum(nvl(executions_delta,0)) execs,
(sum(elapsed_time_delta)/decode(sum(nvl(executions_delta,0)),0,1,sum(executions_delta))/1000000) avg_etime
-- sum((buffer_gets_delta/decode(nvl(buffer_gets_delta,0),0,1,executions_delta))) avg_lio
from DBA_HIST_SQLSTAT S, DBA_HIST_SNAPSHOT SS
where ss.snap_id = S.snap_id
and ss.instance_number = S.instance_number
and executions_delta > 0
group by sql_id, plan_hash_value
)
)
group by sql_id, stddev_etime
)
where norm_stddev > nvl($1,2)
and max_etime > nvl($2,.1)
order by norm_stddev
/
EOF

运行脚本的命令为: ksh get_unstable_plan.sh 如果想去默认值,则标准方差为2,最小执行时间会为0.1秒 得到的结果如下: SQL_ID SUM(EXECS) MIN_ETIME MAX_ETIME NORM_STDDEV ------------- ---------- ----------- ----------- ------------- 3z4j311583sk6 3 29.02 1,289.51 30.7138 0m3s751sxzva5 13 3.21 405.64 71.6833 fkptmvqbtv85k 7 .78 374.25 340.5359 6nm4yy7pgdzad 2 .12 347.92 1,996.4307 可以看到有些语句的差别还是很大的,本来几十秒,但是有时候执行又是半个小时,本来执行在毫秒,但是有时候执行时间在几分钟,这些都是需要注意的问题。

本文分享自微信公众号 - 杨建荣的学习笔记(jianrong-notes)

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

原始发表时间:2015-02-08

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏陈满iOS

看图学算法(二)数据结构基本概念篇

过了一个星期,笔者花了整整几天时间学习的整理,下面是第二篇即数据结构基本概念篇。很辛苦,希望会对大家有一点帮助。另外,本文系列第一篇在这里:看图学算法(一)算法...

13250
来自专栏量子位

手把手教你训练一个秒杀科比的投篮AI,不服来练 | 附开源代码

在这篇教程中,谷歌工程师Abe Haskins用简洁易懂的语言,教你用Unity3D和TensorFlow生产一只会投篮的AI。

16500
来自专栏AI研习社

Github 项目推荐 | 用于运行和训练深度神经网络的开源 C++ 库 —— nGraph

nGraph 目前支持三种流行的深度学习框架(neon、MXNet、TensorFlow),对于其他的深度学习框架,开发者可以根据官方的引导指南来创建用于编译和...

17220
来自专栏瓜大三哥

多周期路径的约束

放松时序要求 ? 应用1:clk1和clk2是同频但不同相,其中clk2相对于clk1有正向的相位偏移 set_multicycle_path -from [...

399100
来自专栏祝威廉

Spark团队新作MLFlow 解决了什么问题

中午的时候看到了Spark团队新作MLFlow,因为我本身也在做类似的解决方案MLSQL,自然要看看Meitai是怎么做的。所以第一时间把MLFlow相关文档 ...

22320
来自专栏Windows Community

Microsoft AI - Custom Vision

概述 前几天的 Windows Developer Day 正式发布了 Windows AI Platform,而作为 Windows AI Platform ...

486100
来自专栏CVer

【重磅】吴恩达最新的机器学习书籍更新啦!

Amusi曾于2018年4月5日推送了重磅:吴恩达最新的机器学习书籍《Machine Learning Yearning》,当时Amusi收到了一封邮件,如下所...

13320
来自专栏me的随笔

【译】10个机器学习的JavaScript示例

原文地址:10 Machine Learning Examples in JavaScript

9020
来自专栏机器之心

学界 | AAAI-17论文提出深度学习C语言修改器DeepFix:用人工智能加「;」

选自aaai.org 机器之心编译 参与:吴攀 如果你是一个程序员,你一定体验过编译时报错的痛苦,有时候一个小错误可能就需要你很多时间检查许多代码才能找到。近...

31650
来自专栏磨磨谈

调整PG分多次调整和一次到位的迁移差别分析

这个问题来源于我们研发的一个问题,在进行pg调整的时候,是一次调整到位好,还是分多次调整比较好,分多次调整的时候会不会出现某个pg反复挪动的问题,造成整体迁移量...

8410

扫码关注云+社区

领取腾讯云代金券