一般在混合型环境中,大表在进行全表扫描或者走并行的时候一般会出现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. 搭建redsocks 测试环境

    1. 先来谈谈pc的测试环境 socks5代理,因为要在centos下设置,没有yum到socks, 就安装ss5,wget http://jaist.dl.sourceforge.net/proje ...

  2. EasyUI扩展——自定义列排序匹配字段

    一些特殊情况下希望实现:单击某些列,但是排序要按照自定义指定另外的列排序 easyui扩展: 如果不写sort属性则按照默认该列的field排序 $.fn.datagrid.defaults.onBe ...

  3. iOS UI基础-14.0 DatePicker

    DatePicker的主要属性: Mode:显示的内容,可以选择日期.时间的自由组合 Locale:显示的语言样式 Interval:每个选项的时间间隔 Date:当前选择的时间 Constraint ...

  4. python对字典及列表递归排序

    对字典内所有内容进行排升序排序,包括,子数组,子字典 需要注意: 1.字典因为是在一定程序上无序的,所以这里采用了内置包,来变成有序字典 from collections import Ordered ...

  5. 12月centos单词

    ---恢复内容开始--- UNreachable:adj.(network server unreachable) 不能达到的; 及不到的; 取不到的; 不能得到的; rsync: rsync [re ...

  6. mybatis之接口绑定

    接口绑定方案 mybatis中,提供了一套接口绑定方案,程序员可以提供一个接口,然后提供对应接口的一个mapper.xml文件.MyBatis会自动将接口和xml文件进行绑定.实际上就是mybatis ...

  7. 大数据-05-Spark之读写HBase数据

    本文主要来自于 http://dblab.xmu.edu.cn/blog/1316-2/ 谢谢原作者 准备工作一:创建一个HBase表 这里依然是以student表为例进行演示.这里假设你已经成功安装 ...

  8. Nginx.代理MySQL

    Nginx.代理MySQL 1. Nginx在安装的时候,需要加上一个参数:--with-stream 即Nginx安装指令为:./configure --prefix=/u01/app/nginx  ...

  9. (1)Python3笔记 数据类型之Number与String

    一.Number(数值) 1) 整数 : int 2) 浮点数: float type(1) //int type(1.0) // float type(1+1) // int , 2 type(1+ ...

  10. asp.net webapi 404/或无效控制器/或无效请求 截取处理统一输出格式

    public static class PreRouteHandler     {         public static void HttpPreRoute(this HttpConfigura ...