一般在混合型环境中,大表在进行全表扫描或者走并行的时候一般会出现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相关推荐

  1. ORACLE 索引并行引起的direct path read temp和latch free等待导致进程数超过最大数

    2016年10月27日下午,测试同事说测试数据库连接不上了,让我们DBA查看问题并解决一下.    操作系统:Red Hat Enterprise Linux Server release 6.6 ( ...

  2. 关闭Oracle 11g的DPR特性

    关闭Oracle 11g的DPR(Direct Path Read)特性 查看event参数值: SQL> show parameter eventNAME TYPE VALUE ------- ...

  3. 深入解析direct path read

     传统读取数据的方式是服务器进程通过读取磁盘,然后把数据加载到共享内存中,这样后面的进程就可以通过共享内存访问这些数据,不用再通过缓慢的磁盘读取来 完成.direct path read读取数据块 ...

  4. 【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 ...

  5. Oracle 11g新特性direct path read引发的系统停运故障诊断处理

    Oracle 11g新特性direct path read引发的系统停运故障诊断处理 黎俊杰 | 2016-07-28 14:37 声明:部分表名为了脱敏而用XX代替 1.故障现象 (1)一个业务系统 ...

  6. oracle direct path read temp,Oracle中的direct path read事件(转)

    在11g中,全表扫描可能使用direct path read方式,绕过buffer cache,这样的全表扫描就是物理读了. 在10g中,都是通过gc buffer来读的,所以不存在direct pa ...

  7. 11g direct path read介绍:10949 event、_small_table_threshold与_serial_direct_read

    在11g之前串行的扫描大表默认总是先将数据读取到Oracle高速缓冲中,其等待事件常为db file scattered read.   从11g开始Oracle通过内部算法来决定串行扫描大表是通过直 ...

  8. oracle direct path read temp,direct path read/read temp等待事件

    当会话从磁盘直接读取数据块到PGA(绕过SGA)时,发生direct path read/read temp等待事件 ,下图简要描述了这种方式的读取方式: 如果I/O子系统不支持异步I/Os,那么每个 ...

  9. ORACLE等待事件:direct path write

    2015年4月27日,晚上6点左右,电渠3g2库ORACLE RAC系统节点1出现大量的direct path write等待事件,导致大量的会话堆积,节点1几乎无法使用,应用受到影响,相关处理流程如 ...

最新文章

  1. 2021年大数据常用语言Scala(九):基础语法学习 break和continue
  2. php数组转为js json,php如何将数组转为json数组,php数组转为js数组
  3. 记一则神秘JDK版本引发的hadoop集群慢性崩溃”血案“
  4. MySQL 常用30种SQL查询语句优化方法
  5. 域控 只能访问特定网址_开发人员需要了解的特定于域的语言
  6. CentOS操作系统版本信息查看和隐藏
  7. C++ delete删除动态分配的内存
  8. hdu 1054 Strategic Game
  9. OSChina 周六乱弹 —— 程序猿到底有多少个不解风情的瞬间?
  10. 用python做蒙特卡洛仿真算法
  11. python怎么用sin_python怎么打sin
  12. system.IO.FileNotFoundException: 未能加载文件或程序集
  13. ArcGIS 分类标注
  14. 31 家企业入选阿里云首期云原生加速器,共建云原生行业新生态
  15. JAVA 数据库连接池系列 —— HikariCP 简介
  16. 2021高校毕业生薪酬Top100出炉 !
  17. JEPF快速发开平台
  18. 氧分呗:新时代定义科技的美好 自主创新踏上新征程
  19. 诗经 - 小雅 - 菁菁者莪
  20. Freeswitch在阿里云服务器语音不通问题小记(FS的NAT 穿透)

热门文章

  1. ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车前后左右综合实验
  2. C语言中的各输出格式含义
  3. 【Qt】进程间通信之QSharedMemory示例
  4. 【IT资讯】阿里新推出“阿里云网盘” 速度10MBs,百度网盘或迎来最强对手!
  5. 【ARM】Tiny4412裸板编程之MMU(页 4K)
  6. 【Qt】Qt中QJsonArray类
  7. 【Linux】一步一步学Linux——ldd命令(251)
  8. 【Http协议】深入理解HTTP协议
  9. Linux字符集安装文件,Linux下字符集的安装
  10. java 过滤文件名_Java FileNameFilter过滤文件名