一般在混合型环境中,大表在进行全表扫描或者走并行的时候一般会出现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 altered SQL> alter session set "_serial_direct_read"=false;
Session altered SQL>
SQL> SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ
2 FROM SYS.x$ksppi x, SYS.x$ksppcv y
3 where x.indx = y.indx
4 AND (x.ksppinm = '_small_table_threshold' or
5 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 serial SQL>

还有一个参数 _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/

oracle 11g禁用和强制direct path read的更多相关文章

  1. Oracle 11g 禁用 SQL Tuning Advisor 与 auto space advisor

    生产上有一套11g数据库alert.log报错ORA-16957: SQL Analyze time limit interrupt.  查询MOS相关文档Troubleshooting: ORA-1 ...

  2. 关闭Oracle 11g的DPR特性

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

  3. AWR实战分析之----direct path read temp

    http://blog.sina.com.cn/s/blog_61cd89f60102eej1.html 1.direct path read temp select TOTAL_BLOCKS,USE ...

  4. Oracle 11g全表扫描以Direct Path Read方式执行

    在Oracle Database 11g中有一个新特性,全表扫描可以通过直接路径读的方式来执行(Direct Path Read),这是一个合理的变化,如果全表扫描的大量数据读取是偶发性的,则直接路径 ...

  5. oracle 11G direct path read 很美也很伤人

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

  6. Oracle 11g direct path read 等待事件的理解

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

  7. oracle 11G direct path read 非常美也非常伤人

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

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

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

    黎俊杰 | 2016-07-28 14:37 声明:部分表名为了脱敏而用XX代替 1.故障现象 (1)一个业务系统输入用户名与密码后无法进入首页,表现为一直在运行等待,运行缓慢 (2)整个系统无法正常 ...

随机推荐

  1. SEO--提高权重

    搜索引擎提交入口:将新网站提交收录 SEO优化三要素:标题 关键词 描述 外链(友情链接) 目的:提高权重 注意事项: 1.和内容相近的网站交换 2.链接交换形式多样 单向链接:别人指向我或我指向别人 ...

  2. (转载)spring单例和多例详解。如何在单例中调用多例对象

    spring生成对象默认是单例的.通过scope属性可以更改为多例. <bean id="user" class="modle.User" scope=& ...

  3. iOS 新浪微博-4.0 OAuth授权

    申请开发者 想要拉到到新浪微博的数据,首先让自己成为开发者.申请成为开发者账号很简单,只要有新浪微博的账号即可. 申请地址:http://open.weibo.com/ 在开发的过程中,我们需要拿到几 ...

  4. jquery简介未完成

    jQuery jQuery是一个快速.简洁的javascript框架,是继prototype之后又一个优秀的代码库(或者javascript框架).jQuery设计的宗旨是writeLess,Do M ...

  5. LA 4992 Jungle Outpost(半平面交)

    Jungle Outpost [题目链接]Jungle Outpost [题目类型]半平面交 &题解: 蓝书282 我自己写的代码居然AC了!!! 刘汝佳的说要right要-3什么的,还要特判 ...

  6. mongodb对数组元素及内嵌文档进行增删改查操作(转)

    from:https://my.oschina.net/132722/blog/168274 比如我有一个user类,他包含一个标签属性,这个标签是一个数组,数组里面的元素是内嵌文档,格式如下: &l ...

  7. html常用文本标签(转)

    内容一<br />内容二 让文本强制换行 内容一内容二 <p>段落一</p><p>段落二</p> 段落标签 段落一 段落二 <b> ...

  8. oracle查询数据字典的sql

    使用的sql语句如下: select t1.username 用户, t2.TABLE_NAME 表名称, t3.comments 表业务含义, t2.COLUMN_NAME 字段名称, t4.com ...

  9. https加密过程

    https加密完整过程 step1: “客户”向服务端发送一个通信请求 “客户”->“服务器”:你好 step2: “服务器”向客户发送自己的数字证书.证书中有一个公钥用来加密信息,私钥由“服务 ...

  10. CSS选择符-----元素选择符

       通配选择符(*)           选定所有对象 通配选择符(Universal Selector) 通常不建议使用通配选择符,因为它会遍历并命中文档中所有的元素,出于性能考虑,需酌情使用 & ...