没有索引导致的DIRECT PATH READ
5月20号下午4-5点,某项目组进行数据入库作业,作业人员反映入库速度很慢。在16:30和16:50分别采集了快照,并根据两个快照得到AWR报告。
直接看TOP 5 EVENTS,这是数据库问题诊断的最快捷径。

先看占DB TIME达63.33%的direct path read事件。等待次数78586次,等待总时间3833s(约64分钟),而elapsed time只有20分钟。因此我们需要弄清楚是什么动作导致这么高的direct path read。
那什么是direct path read呢?一般来说,数据块BLOCK(即ORACLE的最小存储单元)总是先由后台服务器进程缓冲至buffer cache,而后才被服务器进程获取。但对于一些大表,将其缓冲至buffer cache势必会将buffer cache中的许多其它对象挤出,即ageing out。为了避免这一情况,产生了direct path read,即不需要缓冲到缓存区,而是直接由服务器进程从磁盘获取。ORACLE通过一些参数控制在何种情况下采取direct path read。
既然direct path read很高,那就直接去查看对于哪些对象的direct path read高。通过查看segment by direct physical reads,可以获得这一信息:

显而易见,direct physical reads是由于访问tbcm_catalogfile引起的。因为physical reads= physical reads cache + physical reads direct,因此,除了查看segment by direct physical reads,也有必要查看一下segment by physical reads 的情况:

Physical reads最多的仍然是表tbcm_catalogfile。现在我们知道了physical reads主要发生在哪个对象上,但仍然不知道发生在哪个业务上(即哪个SQL逻辑上)。即然Physical reads是等待最多,自然地,我们需要去查看Physical reads最多的SQL语句:

根据SQL_ID查看第一条SQL语句,其文本为:
SELECT F_ID, F_OBJECTID, F_FILELOCATION, f_filesrclocation, F_ISONSERVER, F_DATASIZE, F_PACKAGEPATH, F_SERVERID, F_ISMAINFILE, F_FILEPROPERTY, F_DIRTYPE FROM TBCM_CATALOGFILE where F_OBJECTID=:"SYS_B_0" and F_PACKAGEPATH=:"SYS_B_1" order by F_OBJECTID
果然与表tbcm_catalogfile有关,接下来,我们查看该表的相关信息。得知,该表有4,000,000多条记录,F_OBJECTID字段几乎是唯一的,然而表上没有任何索引。由于没有索引,有执行上述SQL时,ORACLE只有选择全表扫描的方式,而对于如此大的一张表,恰好符合了DIRECT PATH READ的条件,因此执行计划选择使用DIRECT PATH READ的方式来获取数据。如果是单个进程,事实上已经很糟了。多个进程是,同于是direct path read,没有将block缓冲至缓存区,所以每个进程都得通过direct path read获取自己想要的数据。情况因此变得更糟。
分析完TOP 5 EVENTS中和第1名,接下来,我们分析一下第2名。
第2名是log file sync。当发出COMMIT或ROLLBACK命令的时间,服务器进程会唤醒LGWR进程,LGWR负责将REDO BUFFER中的日志缓存刷新到日志文件中。而LGWR后台进程产生的等待事件是log file parallel write。因此一般说来,前台log file sync等待事件高,后台log file parallel write也会高,我们在AWR报告中验证一下:

果不其然。另外log file parallel write的avg wait为28ms,高于20,根据经验意味着存在日志文件IO急用。
继续看:

日志在20分钟内切换了5次,平均每4分钟切换一次,这个是远高于15-20分钟公认的切换一次。这说明REDO FILE文件可能过小。
继续看:

20分钟之内,没有发生回退,即user rollback=0。User calls/(user commints + user rollback) =9.87 ,该值小于经验值25,说明系统是提交过于频繁的。
针对上述问题,给出以下应对办法:
- 在tbcm_catalogfile表的F_OBJECTID,F_PACKAGEPATH字段上创建组合索引
- 由于硬件无法更换,所以日志文件的IO争用可不管它
- 将日志文件从现在的50M,改为2G大小
- 由于调整代码工作量过大,COMMIT提交过于频繁的问题可不用管它。
调整之后,再次执行入库作业,并收集15:00-15:15之间的AWR报告。通过验看报告,上述问题解决:

没有索引导致的DIRECT PATH READ的更多相关文章
- direct path write 等待事件导致数据库hang
同事反应十几分钟前数据库好像挂起了一会,让我排查数据库是否存在什么问题. 第一反应看当前数据库还是否有什么等待事件,结果有direct path write等待事件. 于是抓了问题时间段20分钟的AS ...
- 深入解析direct path read (转)
文章转自:http://www.itpub.net/thread-1815281-1-1.html 传统读取数据的方式是服务器进程通过读取磁盘,然后把数据加载到共享内存中,这样后面的进程就可以通过共享 ...
- Oracle 11g direct path read 等待事件的理解
在Oracle 11g中,全表扫描可能使用direct path read方式,绕过buffer cache,这样的全表扫描就是物理读了. 在10g中,都是通过gc buffer来读的,所以不存在di ...
- Oracle 11g新特性direct path read引发的系统停运故障诊断处理
黎俊杰 | 2016-07-28 14:37 声明:部分表名为了脱敏而用XX代替 1.故障现象 (1)一个业务系统输入用户名与密码后无法进入首页,表现为一直在运行等待,运行缓慢 (2)整个系统无法正常 ...
- oracle 11G direct path read 很美也很伤人
direct path read在11g中,全表扫描可能使用direct path read方式,绕过buffer cache,这样的全表扫描就是物理读了. 在10g中,都是通过gc buffer来读 ...
- oracle 11g禁用和强制direct path read
一般在混合型环境中,大表在进行全表扫描或者走并行的时候一般会出现direct path read等待事件,如果在OLTP或者纯粹的DSS环境中,出现大量的direct path read直接路径读取, ...
- direct path read/write (直接路径读/写)
转载:http://www.dbtan.com/2010/04/direct-path-readwrite.html direct path read/write (直接路径读/写): 直接路径读(d ...
- AWR实战分析之----direct path read temp
http://blog.sina.com.cn/s/blog_61cd89f60102eej1.html 1.direct path read temp select TOTAL_BLOCKS,USE ...
- oracle 11G direct path read 非常美也非常伤人
direct path read 在11g中,全表扫描可能使用direct path read方式,绕过buffer cache,这种全表扫描就是物理读了. 在10g中,都是通过gc buffer来读 ...
随机推荐
- Echo团队Alpha冲刺随笔 - 第九天
项目冲刺情况 进展 已经进入测试阶段,正在消除系统的bug 问题 通过测试,找出了系统中存在的较多bug...... 体会 测试太重要了,很多原本以为没什么bug,一测就能找到好几个,而且改个bug真 ...
- JDK1.8 java.io.Serializable接口详解
java.io.Serializable接口是一个标志性接口,在接口内部没有定义任何属性与方法.只是用于标识此接口的实现类可以被序列化与反序列化.但是它的奥秘并非像它表现的这样简单.现在从以下几个问题 ...
- java代码操作word模板并生成PDF
这个博客自己现在没时间写,等后面有时间了,自己再写. 这中需求是在实际的项目开发中是会经常遇到的. 下面我们先从简单入手一步一步开始. 1.首先,使用word创建一个6行两列的表格. 点击插入-6行2 ...
- npm run dev 报错 iview TypeError [ERR_INVALID_CALLBACK]: Callback must be a function
运行npm run dev报这个错 然后找到 D:\text\vue\iview-admin\build\webpack.dev.config.js打开 将这一行代码: fs.write(fd, bu ...
- EF实体类指定部分属性不映射数据库标记
命名空间 ;using System.ComponentModel.DataAnnotations.Schema; 实体部分 public partial class Student { [NotMa ...
- [ML] Tensorflow.js + Image segmentPerson
<!DOCTYPE html> <html> <head> <title>Parcel Sandbox</title> <meta c ...
- 每个开发人员必须知道PDB文件知识
大多数开发人员都意识到PDB文件有助于您进行调试,但仅此而已.如果你不知道PDB文件是怎么回事,不要觉得很糟糕,因为虽然有文档在那里,但它分散在周围,而且大部分是为编译器和调试器编写器准备的.虽然编写 ...
- SVN 常用 查看日志
1.日志查看,有时候会遇到查看一下之前改过的代码,或者恢复某某某个版本,这时就需要用到SVN的查看日志功能了,如图 2.日志列表,这里能看到各个版本的所有信息,包含了版本号 提交人 提交时间 提交时所 ...
- 数据分析师(Data Analyst),数据工程师(Data Engineer),数据科学家(Data Scientist)的区别
数据分析师(Data Analyst):负责从数据中提取出有用的信息,以帮助公司形成业务决策.工作内容包括:对数据进行提取,清洗,分析(用描述统计量,趋势分析,多维度分析,假设检验等统计常用方法对数据 ...
- Luogu5206 【WC2019】数树 【容斥,生成函数】
题目链接 第一问白给. 第二问: 设 \(b=y^{-1}\),且以下的 \(Ans\) 是除去 \(y^n\) 的. 设 \(C(T)\) 是固定了 \(T\) 中的边,再连 \(n-|T|-1\) ...