没有索引导致的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来读 ...
随机推荐
- VMware共享本地文件
最后可以在这里找到
- JavaScript基础05——严格模式
严格模式: 除了正常运行模式,ECMAscript5添加了第二种运行模式:“严格模式”(strict mode).顾名思义,这种模式是的Javascript在更严格的条件下运行. 严格模式的作用: 1 ...
- 一天一经典Efficient Estimation of Word Representations in Vector Space
摘要 本文提出了两种从大规模数据集中计算连续向量表示(Continuous Vector Representation)的计算模型架构.这些表示的有效性是通过词相似度任务(Word Similarit ...
- HTML5之contenteditable可编辑属性
运用contenteditable实现输入框高度自动增加,输入框标题name相对高度自动居中,代码如下: <!DOCTYPE html> <html> <head> ...
- 【转】Java 8新特性(四):新的时间和日期API
Java 8另一个新增的重要特性就是引入了新的时间和日期API,它们被包含在java.time包中.借助新的时间和日期API可以以更简洁的方法处理时间和日期. 在介绍本篇文章内容之前,我们先来讨论Ja ...
- (11)Go方法/接收者
方法和接收者 Go语言中的方法(Method)是一种作用于特定类型变量的函数.这种特定类型变量叫做接收者(Receiver).接收者的概念就类似于其他语言中的this或者 self. 方法的定义格式如 ...
- delphi开第二个进程报错cannot create file editorlineends.ttr
网上说问题是windows系统补丁造成的,解决办法有卸补丁.装插件,还有自己搞个bat启动. 在网上看到最好的一个办法是: 把这个文件EditorLineEnds.ttr的后缀改为ttf,然后安装这个 ...
- centos7下配置ftp服务器
第一步,安装vsftpd这款ftp服务器软件,yum install -y vsftpd 第二步,设置vsftpd服务开机自启动,然后重启服务,查看ftp服务端口,centos6命令如下: #chkc ...
- fluent meshing建立周期性网格
原视频下载地址:https://pan.baidu.com/s/1pKUXKgz 密码: 6pwh
- 刷题记录:[BUUCTF 2018]Online Tool
目录 刷题记录:[BUUCTF 2018]Online Tool 一.知识点 1.escapeshellarg和escapeshellcmd使用不当导致rce 刷题记录:[BUUCTF 2018]On ...