生产环境sql语句调优实战第六篇(r2笔记91天)
生产环境中有大量的sql语句在运行,尽管有awr,ash做数据的收集统计,但是dba的调优工作大多数情况都是在问题已经发生后做排查的,有些sql语句可能执行的时间有1,2分钟左右,但是sql语句本身有潜在的性能问题,通过awr是定位不到的,ash尽管能够查到,但是我们在未知的情况下怎么知道问题发生的精确时间点,通过sql monitor能够查到一些实时的性能问题,但是还是需要按照自己的情况和要求来不间断地进行性能的监控。通过一个工具一劳永逸是不现实的。 今天想做数据迁移也有些日子了,看看生产环境中有哪些sql语句出现频繁,而且有明显的性能问题。 关于通过shell和sql查找性能sql的部分,可以参考如下的帖子,基本原理就是后台做sql_monitor的监控,然后由shell进行性能数据的统计。 http://blog.itpub.net/23718752/viewspace-1253426/ 通过如下的sql语句定位到目前有如下的几个sql语句出现频繁,执行时间较长。
select *from (select sql_id,count(*)cnt from issue_sql where sql_date like '1408%' group by sql_id) order by cnt desc;
SQL_ID CNT
------------------------------ ----------
ap6dzwkwk4zrw 26
xxxxxxxxxxxxx
一般出现性能问题的sql语句执行时间都较长。 可以看到如下的sql语句执行时间很不稳定,最长执行时间差不多在5000多秒。最短在50秒左右。
通过查看执行计划,发现瓶颈在做递归查询的时候。其实那个表很小的,数据不到100条,但是怎么递归出来了百万的数据呢。
相关的语句如下:
SELECT DISTINCT REGEXP_SUBSTR(PARAM_VALUES, '[^,]+', 1, LEVEL) AS SOC_NAME
FROM CM9_BATCH_CONTROL
WHERE PARAM_NAME = 'OFFER'
AND JOB_NAME = 'xxxxxxx'
AND JOB_REC = 'ENDDAY'
CONNECT BY REGEXP_SUBSTR((SELECT PARAM_VALUES
FROM CM9_BATCH_CONTROL
WHERE JOB_NAME = 'xxxxx'
AND PARAM_NAME = 'OFFER'),
'[^,]+',
1,
LEVEL) IS NOT NULL;
化繁为简,先来看一下这个语句想要做什么,通过下面的查询,发现出现了一些列值按照逗号进行分隔。
SELECT PARAM_VALUES
FROM CM9_BATCH_CONTROL
WHERE JOB_NAME = 'xxxxx'
AND PARAM_NAME = 'OFFER'
PARAM_VALUES
--------------------------------------------------------------------------------
ROHOMS01,ROHOMS02,TESTVDF01,TESTVDF02
可以猜想最开始的想法应该是要解析字符串,做一个行列转行。
在这个基础上去查看完整的语句就清楚了。
所以按照这个思路输出的结果应该是
SOC_NAME
--------------------------------------------------------------------------------
ROHOMS01
ROHOMS02
TESTVDF01
TESTVDF02
按照这个思路,可以给出如下的改进版本,这个语句的关键就在下面的标黄处。
生成一个类似dual表的虚表来存放一些需要的数据然后和基表做匹配。
SELECT CO.SOC_CD FROM (SELECT REGEXP_SUBSTR(PARAM_VALUES,'[^,]+',1,l) AS SOC_NAME
FROM CM9_BATCH_CONTROL
,(SELECT LEVEL l FROM DUAL CONNECT BY LEVEL<=100)
WHERE PARAM_NAME = 'OFFER'
AND JOB_NAME = 'xxxx'
AND JOB_REC = 'ENDDAY'
AND l <=LENGTH(PARAM_VALUES) - LENGTH(REPLACE(PARAM_VALUES,','))+1
)T, CSM_OFFER CO WHERE T.SOC_NAME = CO.SOC_NAME
and T.SOC_NAME is not null
来看看执行的效果怎么样吧。
Elapsed: 00:00:00.05
生成的数据也是按照预期的格式进行了行列转换。
- 使用贝叶斯做英文拼写检查(c#)
- 贝叶斯文本分类c#版
- weex里Vuex state使用storage持久化
- 网络字体@font-face 如何处理网页中的特殊字体
- python实现多变量线性回归(Linear Regression with Multiple Variables)
- 【美团技术团队博客】序列化和反序列化
- Java 静态代理与动态代理
- ELK日志套件安装与使用
- HTML知识复习
- MarkDown 常用语法教程
- CSS3盒阴影 box-shadow
- HTML5-类库系列 补讲AJAX
- HTML5-类库系列 事件与获取完成版样式
- 为什么不要在 JavaScript 中使用位操作符?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法