一般在混合型环境中,大表在进行全表扫描或者走并行的时候一般会出现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. jenkins 多用户同时触发构建—简单实用

    插件:build name setter plugin 插件地址:http://updates.jenkins-ci.org/download/plugins/ 其实以上插件,不使用也可以,以上插件我 ...

  2. ios9 适配的坑

    http://www.cocoachina.com/ios/20151016/13715.html

  3. Hibernate框架第三天

    **课程回顾:Hibernate第二天** 1. 持久化类和一级缓存 * 持久化类:JavaBean + 映射的配置文件 * 持久化对象的三种状态 * 瞬时态 * 持久态:有自动更新数据的能力 * 托 ...

  4. 关于plsqldev无法正常加载oracle instantclient中的oci.dll的其中一个原因

    事情的经过是这样的: 1. 新安装了windows10 系统,装了plsqldev 和 oracle instantclient,以及 instantclient sqlplus. 2.设置好了ORA ...

  5. Discuz目录结构

    /source/class/task站点任务内置包 task_avatar.php头像类任务 task_blog.php发表日志任务 task_connect_bind.phpQQ 帐号绑定任务 ta ...

  6. hdu5294 网络流+dijskstr

    题意:给你n个墓室,m条路径,一个人在1号墓室(起点),另一个人在n号墓室(终点),起点的那个人只有通过最短路径才能追上终点的那个人,而终点的那个人能切断任意路径. 第一问——终点那人要使起点那人不能 ...

  7. spring aop 执行顺序

    aop 执行顺序: // @Before // @AfterThrowing order 值越小,执行时越靠前 // @After // @AfterReturning order 值越大,执行时越靠 ...

  8. tensorflow--variable_scope

    1.with tf.variable_scope(name , reuse = reuse) (1)创建variable scope with tf.variable_scope("foo& ...

  9. c# 设置控件的前景颜色和背景颜色

    AutoSize:设置为false取消自动计算尺寸功能,控件的大小则按照设定的Size来呈现,设置为true自动计算大小 TextAlign:设置对齐方式 // // 摘要: // 用默认的所有者运行 ...

  10. IDEA相关知识整理

    一.离线下载插件[也可以通过代理的方式下载插件] http://plugins.jetbrains.com/ 下载离线插件 settings -> plugins -> install p ...