[Oracle] 某游戏大区DB IO负载过高分析
某游戏大区DB IO负载过高分析
【问题】
下图信息看出机器IO负载过高, IO使用率: 平均值 50%, 峰值 98%, 业务高峰时间段(19:00-22:00)IO使用率持续80%以上.
【分析】
提取20:00-21:00的AWR报告内容:
关联SQL:
物理读Top:
对应的SQL语句如下:
select b.nick, a.itemid
from
(
select usn, tousn, itemid, logdate, gtype
from
r2b2_ap_item_log
where
tousn=:V00001 and
logdate>=:V00002 and
gtype in ('E', 'G', 'A') and
rownum <= 100
union all
select usn, tousn, itemid, logdate, gtype
from
r2b2_cs_item_log
where t
ousn=:V00003 and
logdate>=:V00004 and
gtype in ('E', 'G', 'A') and
rownum <= 100
) a, r2b2_user b
where
a.usn=b.usn
order by logdate;
从AWR以及SQL中可以看出:
- 这条SQL在1h内执行了3505次, 几乎每秒执行一次, 每次cost time是0.45秒;
- 看SQL内容, 发现是LOG道具日志表和USER信息表的关联查询;
- 查看SQL的执行计划命中了索引, 但不是很好;
- 从Physical Reads中看到发生物理读最多的也是SQL中关联到的R2B2_CS_ITEM_LOG表和R2B2_AP_ITEM_LOG表;
【解决办法】
- 对表R2B2_AP_ITEM_LOG和R2B2_CS_ITEM_LOG创建基于TOUSN和GTYPE的复合索引;
- 升级DB机器硬件.
【分析测试】
测试中绑定变量为:
V00001=14963971
V00002=20111026035807
V00003=14963971
V00004=20111026035807
优化前执行计划:
从上面执行计划看到 :
- R2B2_AP_ITEM_LOG表和R2B2_CS_ITEM_LOG表均命中了TOUSN的索引;
- 观察A-Rows和Buffers以及Reads信息发现: Id=7&8步骤发生物理读130块, 逻辑读130块, 返回1行. 说明索引的效果并没有很好的发挥作用;
- 单次SQL执行在最差情况下发生逻辑读233块, 233*8KB=1864KB;
- 单次SQL执行在最差情况下发生物理读229块, 229*8KB=1832KB 物理IO交换;
观察SQL执行计划, 在Id=7&8以及Id=10&11步骤时TOUSN索引效率不高, 不能精确匹配到ROWID信息, 返回的结果集太多, 其中包含很多无用的信息, 在其上的步骤都是根据ROWID信息访问数据结构返回数据.
因此要解决SQL执行效率问题, 关键在Id=7&8以及Id=10和11步骤.
考虑尽量在Id=8和Id=11步骤就可以从索引结构中的叶子节点精确返回ROWID信息, 减少返回的结果集. 从而在Id=7和Id=10步骤得到上一步结果集后访问数据结构时, 就可以减少物理IO.
添加索引:
在这里复合索引的选择上有2中选择:
a. TOUSN和LOGDATE复合索引;
b. TOUSN和GTYPE复合索引;观察表数据分布, 对于GTYPE列选择E、G、A类型主要是礼物、活动分发、管理者提供的, 相对量少很多;
因此, 选择GTYPE做为索引列会增强SQL的selectivity, 提高SQL执行效率;
优化后执行计划:
从上面执行计划看出:
- 查询命中了新的索引(TOUSN和GTYPE复合索引);
- 观察A-Rows和Buffers以及Reads信息发现: Id=7&8步骤发生物理读4块, 逻辑读4块, 返回1行数据, 物理读和逻辑读大大减少. 说明在索引扫描阶段就可以很精确的匹配到ROWID信息;
- 单次SQL执行在最差情况下发生逻辑读16块, 16*8KB=128KB;
- 单次SQL执行在最差情况下发生物理读12块, 12*8KB=96KB 物理IO交换;
- 从Predicate Information看到, 通过TOUSN访问到叶子节点中GTYPE信息, 然后通过SQL输入的GTYPE值过滤出准确的ROWID信息;
【收益】
物理读(块/次) 逻辑读(块/次) 物理IO(KB/次) 优化前 229 233 优化后 12 16 可以看出:
- 单次SQL执行物理读取数据块减少217块;
- 单次SQL执行发生逻辑IO减少1864KB-128KB=1736KB=1.7MB;
- 单次SQL执行发生物理IO减少1832KB-96KB=1736KB=1.7MB;
[Oracle] 某游戏大区DB IO负载过高分析的更多相关文章
- 针对系统中磁盘IO负载过高的指导性操作
针对系统中磁盘IO负载过高的指导性操作 主要命令:echo deadline > /sys/block/sda/queue/scheduler 注:以下的内容仅是提供参考,如果磁盘IO确实比较大 ...
- 磁盘IO过高时的处理办法 针对系统中磁盘IO负载过高的指导性操作
磁盘IO过高时的处理办法 针对系统中磁盘IO负载过高的指导性操作 主要命令:echo deadline > /sys/block/sda/queue/scheduler 注:以下的内容仅是提供参 ...
- cpu负载过高分析
如何定位是哪个服务进程导致CPU过载,哪个线程导致CPU过载,哪段代码导致CPU过载? 步骤一.找到最耗CPU的进程 工具:top 方法: 执行top -c ,显示进程运行信息列表 键入P (大写p) ...
- IO负载高的来源定位
前言: 在一般运维工作中经常会遇到这么一个场景,服务器的IO负载很高(iostat中的util),但是无法快速的定位到IO负载的来源进程和来源文件导致无法进行相应的策略来解决问题. 这个现象在MySQ ...
- iotop,pt-ioprofile : mysql IO负载高的来源定位
http://www.cnblogs.com/cenalulu/archive/2013/04/12/3016714.html 前言: 在一般运维工作中经常会遇到这么一个场景,服务器的IO负载很高(i ...
- IO负载高的来源定位 IO系列
http://elf8848.iteye.com/category/281637 前言: 在一般运维工作中经常会遇到这么一个场景,服务器的IO负载很高(iostat中的util),但是无法快速的定位到 ...
- IO负载高来源定位pt-ioprofile
1.使用top -d 1 查看%wa是否有等待IO完成的cpu时间,简单理解就是指cpu等待磁盘写入完成的时间:IO等待所占用的cpu时间的百分比,高过30%时IO压力高: 2.使用iostat -d ...
- 查看IO负载
负载(load)是linux机器的一个重要指标,直观了反应了机器当前的状态.如果机器负载过高,那么对机器的操作将难以进行. Linux的负载高,主要是由于CPU使用.内存使用.IO消耗三部分构成.任意 ...
- 系统吞吐量(TPS)、用户并发量、性能测试、IO负载学习
目录 . 如何评价一个系统的性能 . 系统吞度量 . 网络上下行数据量 . 客户端-服务端TCP同时长连接数量 . 系统性能的指标计算 . 系统IO负载 1. 如何评价一个系统的性能 在文章的开始,我 ...
随机推荐
- (转)为什么在 2013 十月番中出现了很多以 3D 渲染代替传统 2D 绘画来表现人物的镜头?
一直都有的,特别是三次元这家公司一直致力于3d的风格化渲染既大家说的3d转2d.目前最厉害的商业化软件是pencil+,占领大部分的作品.而mentalray,早期用于disney的部分风格化渲染:i ...
- iframe子元素相对于父页面滚动条固定(iframe无滚动条,iframe固定高度有滚动条,两种情况)
一.当iframe自适应高度,无滚动条时候: 例如这样: //随着父页面滚动条滚动定位“#qn-quc”他的位置固定在顶部 $(parent.window).scroll(function() { v ...
- Codeforces Round #496 (Div. 3) ABCDE1
//B. Delete from the Left #include <iostream> #include <cstdio> #include <cstring> ...
- Spark MLlib(下)--机器学习库SparkMLlib实战
1.MLlib实例 1.1 聚类实例 1.1.1 算法说明 聚类(Cluster analysis)有时也被翻译为簇类,其核心任务是:将一组目标object划分为若干个簇,每个簇之间的object尽可 ...
- Markdowm语法学习
Markdowm语法学习 标题 一级标题 一级标题 #一级标题 二级标题 二级标题 ##二级标题 六级标题 六级标题 ######六级标题 引用 引用 >引用 代码块 if(i == 0) { ...
- Cakephp在Controller中显示sql语句
Cakephp在Controller中查询语句一般是: $this->Model->find(); 那么这条语句对应的sql语句是什么呢? 可以通过下面方法显示: 1. $dbo = Co ...
- MySQL时间字段究竟使用INT还是DateTime
今天解析DEDECMS时发现deder的MYSQL时间字段,都是用 `senddata` ) unsigned '; 随后又在网上找到这篇文章,看来如果时间字段有参与运算,用int更好,一来检索时不用 ...
- leetcode 【 Trapping Rain Water 】python 实现
题目: Given n non-negative integers representing an elevation map where the width of each bar is 1, co ...
- Android 使用剪贴板传递简单数据及复杂数据的方法
传递数据的场景在于不同页面之间跳转,需要携带数据:简单数据值指的是String, int等数据, 复杂数据指的是类 1. 使用剪贴板传递简单数据方法: 第一个页面里面放数据操作如下: Clipbo ...
- python实现算法: 多边形游戏 数塔问题 0-1背包问题 快速排序
去年的算法课挂了,本学期要重考,最近要在这方面下点功夫啦! 1.多边形游戏-动态规划 问题描述: 多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形.每个顶点被赋予一个整数值, 每条边被 ...