oracle 11g禁用和强制direct path read
一般在混合型环境中,大表在进行全表扫描或者走并行的时候一般会出现direct path read等待事件,如果在OLTP或者纯粹的DSS环境中,出现大量的direct path read直接路径读取,这样就有问题了,尤其是一些流水线的批处理系统中,会导致大量的free buffer wait等(因为direct path reads会导致oracle执行object level checkpoint将所有目标对象的脏块写入磁盘,然后将这些块从磁盘读取到进程的PGA,如果有未提交的事务,还必须使用PGA构造读一致性块缓冲。所以parallel是把双刃剑,用的不好,系统性能会很慢,尤其是在跑批系统中,增加了大量不必要的物理读写,要想跑的飞快,cpu利用起来,应用层的fork-join线程池设计极大的决定了系统的性能)。一般在OLTP中,都是事务型的sql,如果想sql执行效率,那么最好从内存当中读取数据,直接从数据文件中读取,后果可想而知了。这里就可能需要我们禁用direct path read。
在oracle 11.2之前,只要没有设置_serial_direct_read为true,同时没有指定并行执行,oracle会将HWM以下的块读入buffer cache。如果走了并行执行,意味着所有的表都会导致direct read,即使表不大也如此。
从11.2开始,oracle默认会自动决定要不要在非并行执行的时候绕过buffer cache并使用direct path read(为什么这是合适的呢,举个例子,假设有张表有1亿条数据,平均纪录长度200,全表扫描意味着20G的buffer cache,而服务器本身可能只配置了64G,很明显一张1亿条记录的表不太可能是所有记录都经常要访问的,但是其中的1/10经常访问是可能的,此时如果这个表没有分区显然是不合理的)。同时,更重要的是,我们可以通过参数控制并行查询的时候对某些表的扫描可以走buffer cache,而不是direct read。
oracle根据几个参数决定全表扫描的时候是否走直接路径读,首先是_small_table_threshold隐含参数,它决定oracle认为的小表阈值(同时,读取少于该值的parallel将使用buffer cache),每个环境和版本都可能不同,默认值约为默认值是db cache size的2%大小。如下:
_serial_direct_read值控制非并行执行的时候是否允许走直接读。默认情况下,如果表大于_small_table_threshold*5,则全表扫描的时候自动会被调整为direct read,也就是buffer cache的1/10左右(这个算大、也不算大)。
这个值其实应该被启用,这是对的,但是应该合理设置_small_table_threshold的阈值以最小化不必要的物理io。
可以通过两种方式是禁用直接读,如下:
SQL> alter system set event='10949 TRACE NAME CONTEXT FOREVER, level 1' scope=spfile; System alteredSQL> alter session set "_serial_direct_read"=false; Session alteredSQL> SQL> SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ2 FROM SYS.x$ksppi x, SYS.x$ksppcv y3 where x.indx = y.indx4 AND (x.ksppinm = '_small_table_threshold' or5 x.ksppinm = '_serial_direct_read'); NAME VALUE DESCRIB -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- _small_table_threshold 30338 lower threshold level of table size for direct reads _serial_direct_read FALSE enable direct read in serialSQL>
还有一个参数 _very_large_object_threshold 用于设定(MB单位)不使用direct path read方式的上限,这个参数需要结合10949事件共同发挥作用。10049和_very_large_object_threshold参数一起的时候,只要_very_large_object_threshold小于目标表大小*0.8或者buffer cache*5,就可以不走direct path read。所以,要想完全禁用非并行执行时的直接路径读,只要将_very_large_object_threshold设置的足够大即可,不过不建议超过20%*buffer cache(否则要么是分区没使用或者不合理)。
所以在并行和串行之间存在一个矛盾点,这个矛盾点只能通过高配置服务器比如256GB/128C+良好的表结构设计或者应用层面的分而治之来解决。
当然,我没有仔细去测,最近太忙,没有时间一一去验证,后面会仔细验证效果如何。
这给帖子写的不错,可以参考下http://www.itpub.net/thread-1815281-1-1.html
参考:http://oracleinaction.com/direct-reads-11g/
转载于:https://www.cnblogs.com/zhjh256/p/9506247.html
oracle 11g禁用和强制direct path read相关推荐
- ORACLE 索引并行引起的direct path read temp和latch free等待导致进程数超过最大数
2016年10月27日下午,测试同事说测试数据库连接不上了,让我们DBA查看问题并解决一下. 操作系统:Red Hat Enterprise Linux Server release 6.6 ( ...
- 关闭Oracle 11g的DPR特性
关闭Oracle 11g的DPR(Direct Path Read)特性 查看event参数值: SQL> show parameter eventNAME TYPE VALUE ------- ...
- 深入解析direct path read
传统读取数据的方式是服务器进程通过读取磁盘,然后把数据加载到共享内存中,这样后面的进程就可以通过共享内存访问这些数据,不用再通过缓慢的磁盘读取来 完成.direct path read读取数据块 ...
- 【Oracle】11g direct path read介绍:10949 event、_small_table_threshold与_serial_direct_read
转自刘相兵老师的博文: http://www.askmaclean.com/archives/11g-direct-path-read-10949-_small_table_threshold-_se ...
- Oracle 11g新特性direct path read引发的系统停运故障诊断处理
Oracle 11g新特性direct path read引发的系统停运故障诊断处理 黎俊杰 | 2016-07-28 14:37 声明:部分表名为了脱敏而用XX代替 1.故障现象 (1)一个业务系统 ...
- oracle direct path read temp,Oracle中的direct path read事件(转)
在11g中,全表扫描可能使用direct path read方式,绕过buffer cache,这样的全表扫描就是物理读了. 在10g中,都是通过gc buffer来读的,所以不存在direct pa ...
- 11g direct path read介绍:10949 event、_small_table_threshold与_serial_direct_read
在11g之前串行的扫描大表默认总是先将数据读取到Oracle高速缓冲中,其等待事件常为db file scattered read. 从11g开始Oracle通过内部算法来决定串行扫描大表是通过直 ...
- oracle direct path read temp,direct path read/read temp等待事件
当会话从磁盘直接读取数据块到PGA(绕过SGA)时,发生direct path read/read temp等待事件 ,下图简要描述了这种方式的读取方式: 如果I/O子系统不支持异步I/Os,那么每个 ...
- ORACLE等待事件:direct path write
2015年4月27日,晚上6点左右,电渠3g2库ORACLE RAC系统节点1出现大量的direct path write等待事件,导致大量的会话堆积,节点1几乎无法使用,应用受到影响,相关处理流程如 ...
最新文章
- 2021年大数据常用语言Scala(九):基础语法学习 break和continue
- php数组转为js json,php如何将数组转为json数组,php数组转为js数组
- 记一则神秘JDK版本引发的hadoop集群慢性崩溃”血案“
- MySQL 常用30种SQL查询语句优化方法
- 域控 只能访问特定网址_开发人员需要了解的特定于域的语言
- CentOS操作系统版本信息查看和隐藏
- C++ delete删除动态分配的内存
- hdu 1054 Strategic Game
- OSChina 周六乱弹 —— 程序猿到底有多少个不解风情的瞬间?
- 用python做蒙特卡洛仿真算法
- python怎么用sin_python怎么打sin
- system.IO.FileNotFoundException: 未能加载文件或程序集
- ArcGIS 分类标注
- 31 家企业入选阿里云首期云原生加速器,共建云原生行业新生态
- JAVA 数据库连接池系列 —— HikariCP 简介
- 2021高校毕业生薪酬Top100出炉 !
- JEPF快速发开平台
- 氧分呗:新时代定义科技的美好 自主创新踏上新征程
- 诗经 - 小雅 - 菁菁者莪
- Freeswitch在阿里云服务器语音不通问题小记(FS的NAT 穿透)
热门文章
- ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车前后左右综合实验
- C语言中的各输出格式含义
- 【Qt】进程间通信之QSharedMemory示例
- 【IT资讯】阿里新推出“阿里云网盘” 速度10MBs,百度网盘或迎来最强对手!
- 【ARM】Tiny4412裸板编程之MMU(页 4K)
- 【Qt】Qt中QJsonArray类
- 【Linux】一步一步学Linux——ldd命令(251)
- 【Http协议】深入理解HTTP协议
- Linux字符集安装文件,Linux下字符集的安装
- java 过滤文件名_Java FileNameFilter过滤文件名