11g直接路径读、相关参数、10949事件介绍
转载自刘向兵老师:http://www.askmaclean.com/archives/11g-direct-path-read-10949-_small_table_threshold-_serial_direct_read.html
在11g之前串行的扫描大表默认总是先将数据读取到Oracle高速缓冲中,其等待事件常为db file scattered read。
从11g开始Oracle通过内部算法来决定串行扫描大表是通过直接路径读direct path read,还是先读入到buffer cache中,此算法依据表的大小评估。
_small_table_threshold 隐藏参数指定了 ORACLE中大表的阀值,其单位为block,即大于_small_table_threshold 所指定的块数的表被视作大表,
否之视为”small table”。 对于大表”large table”,SQL执行层认为存在直接路径读取的意义(direct path read)。 对于小表,将它缓存在buffer cache中的收益更大,所以直接路径读取不具有意义。_small_table_threshold 隐藏参数的值在实例启动时动态决定,一般为 2% * DB_CACHE_SIZE。
direct path read的优势:
1. 减少了对闩(latch)的使用,避免可能的闩争用
2.物理IO的大小不再取决于buffer_cache中所存在的块;试想某个8个块的extent中1,3,5,7号块在高速缓存中,而2,4,6,8块没有被缓存,传统的方式在读取该extent时将会是对2,4,6,8块进行4次db file sequential
read,其效率往往要比单次读取这个区间的所有8个块还要低得多,Oracle为了避免这种情况总是尽可能的不缓存大表的块(读入后总是放在队列最冷的一端);而direct path read则可以完全避免这类问题,尽可能地单次读入更多的物理块。
当然直接路径读取也会引入一些缺点:
1.即便在buffer cache足够大到可以放下整个大表的情况下,direct path read无法从高速缓冲受益,每次扫描大表均需重复等量的直接路径物理读取IO
2.在直接路径读取某段前需要对该对象进行一次段级的检查点(A segment checkpoint).
3.可能导致重复的延迟块清除操作
该11g自动判断direct path read的特性适用场景:
1. 对大表不频繁地串行全表扫描的场景
2. Db Cache Size高速缓冲大小远小于表的大小的场景
不推荐在以下场景中开启该11g自动判断direct path read特性:
1. 从运行稳定的老版本(9i、10g)升级到11g的数据库
2. 对大表频繁地串行全表扫描的场景
SQL> select * from v$version;
BANNER
——————————————————————————–
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 – 64bit Production
PL/SQL Release 11.2.0.3.0 – Production
CORE 11.2.0.3.0 Production
TNS for Linux: Version 11.2.0.3.0 – Production
NLSRTL Version 11.2.0.3.0 – Production
col name for a30
col value for a20
col DESCRIB for a60
set linesize 140 pagesize 1400
SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ
FROM SYS.x$ksppi x, SYS.x$ksppcv y
WHERE x.inst_id = USERENV (‘Instance’)
AND y.inst_id = USERENV (‘Instance’)
AND x.indx = y.indx
AND (x.ksppinm =’_small_table_threshold’ or x.ksppinm=’_serial_direct_read’);
NAME VALUE DESCRIB
—————————— ——————– ————————————————————
_small_table_threshold 1143 lower threshold level of table size for direct reads
_serial_direct_read auto enable direct read in serial
其中_small_table_threshold 隐藏参数指定了 ORACLE中大表的阀值,其单位为block,即大于_small_table_threshold 所指定的块数的表被视作大表,
否之视为”small table”。 对于大表”large table”,SQL执行层认为存在直接路径读取的意义(direct path read)。 对于小表,将它缓存在buffer cache中的收益更大,所以直接路径读取不具有意义。
_small_table_threshold 隐藏参数的值在实例启动时动态决定,一般为 2% * DB_CACHE_SIZE。
SQL> alter system set db_cache_size=1024M scope=spfile;
System altered.
RESTART INSTANCE:
SQL> col name for a30
SQL> col value for a20
SQL> col DESCRIB for a60
SQL> set linesize 140 pagesize 1400
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.inst_id = USERENV (‘Instance’)
4 AND y.inst_id = USERENV (‘Instance’)
5 AND x.indx = y.indx
6 AND (x.ksppinm =’_small_table_threshold’ or x.ksppinm=’_serial_direct_read’);
NAME VALUE DESCRIB
—————————— ——————– ————————————————————
_small_table_threshold 2522 lower threshold level of table size for direct reads
_serial_direct_read auto enable direct read in serial
2522 block = 2522 * 8k = = 19.7 M 约等于 1024 * 2%
SQL> create table tmac (t1 char(2000)) pctfree 99 pctused 1 tablespace users;
Table created.
SQL> insert into tmac select ‘MACLEAN’ from dual connect by level <=2530;
2530 rows created.
SQL> commit;
Commit complete.
SQL> exec dbms_stats.gather_table_stats(‘SYS’,’TMAC’);
PL/SQL procedure successfully completed.
SQL> select blocks from dba_tables where table_name=’TMAC’;
BLOCKS
———-
2638
SQL> alter system flush buffer_cache;
SQL> select count(*) from tmac;
COUNT(*)
———-
2530
SQL> select vm.sid, vs.name, vm.value
2 from v$mystat vm, v$sysstat vs
3 where vm.statistic# = vs.statistic#
4 and vs.name in (‘cleanouts only – consistent read gets’,
5 ‘session logical reads’,
6 ‘physical reads’,
7 ‘physical reads direct’);
SID NAME VALUE
———- —————————————————————- ———-
135 session logical reads 2859
135 physical reads 2763
135 physical reads direct 2576
135 cleanouts only – consistent read gets 0
physical reads direct 增加说明上面的查询使用了direct path read
SQL> alter session set “_serial_direct_read”=never;
Session altered.
SQL> select count(*) from tmac;
COUNT(*)
———-
2530
SQL> select vm.sid, vs.name, vm.value
2 from v$mystat vm, v$sysstat vs
3 where vm.statistic# = vs.statistic#
4 and vs.name in (‘cleanouts only – consistent read gets’,
5 ‘session logical reads’,
6 ‘physical reads’,
7 ‘physical reads direct’);
SID NAME VALUE
———- —————————————————————- ———-
135 session logical reads 5497
135 physical reads 5339
135 physical reads direct 2576
135 cleanouts only – consistent read gets 0
SQL> select count(*) from tmac;
COUNT(*)
———-
2530
SQL> select vm.sid, vs.name, vm.value
2 from v$mystat vm, v$sysstat vs
3 where vm.statistic# = vs.statistic#
4 and vs.name in (‘cleanouts only – consistent read gets’,
5 ‘session logical reads’,
6 ‘physical reads’,
7 ‘physical reads direct’);
SID NAME VALUE
———- —————————————————————- ———-
135 session logical reads 8135
135 physical reads 5339
135 physical reads direct 2576
135 cleanouts only – consistent read gets 0
physical reads direct 不再增加说明以上2次查询未使用direct path read
隐藏参数”_serial_direct_read” 指定了是否启用串行全表扫描下的直接路径读取(direct path read),其默认值为AUTO,设置为NEVER时禁用11g自动direct path read的特性
SQL> alter session set “_serial_direct_read”=auto;
Session altered.
还原session级别的_serial_direct_read 参数
SQL> delete tmac where rownum<2000;
1999 rows deleted.
SQL> commit;
Commit complete.
SQL> alter table tmac move tablespace users pctfree 10 pctused 90;
Table altered.
SQL> exec dbms_stats.gather_table_stats(‘SYS’,’TMAC’);
PL/SQL procedure successfully completed.
SQL> select blocks from dba_tables where table_name=’TMAC’;
BLOCKS
———-
189
将TMAC表缩小到 _small_table_threshold以下
SQL> alter system flush buffer_cache;
System altered.
SQL> select count(*) from tmac;
COUNT(*)
———-
531
SQL> select vm.sid, vs.name, vm.value
2 from v$mystat vm, v$sysstat vs
3 where vm.statistic# = vs.statistic#
4 and vs.name in (‘cleanouts only – consistent read gets’,
5 ‘session logical reads’,
6 ‘physical reads’,
7 ‘physical reads direct’);
SID NAME VALUE
———- —————————————————————- ———-
135 session logical reads 524
135 physical reads 349
135 physical reads direct 0
135 cleanouts only – consistent read gets 1
以上演示证明对于small table(块数小于_small_table_threshold),SQL执行层自动并不决定使用direct path read,而是将之读取到buffer cache中并逻辑读。
结论:
其中_small_table_threshold 隐藏参数指定了 ORACLE中大表的阀值,其单位为block,即大于_small_table_threshold 所指定的块数的表被视作大表,
否之视为”small table”。 对于大表”large table”,SQL执行层认为存在直接路径读取的意义(direct path read)。 对于小表,将它缓存在buffer cache中的收益更大,所以直接路径读取不具有意义。
_small_table_threshold 隐藏参数的值在实例启动时动态决定,一般为 2% * DB_CACHE_SIZE。
隐藏参数”_serial_direct_read” 指定了是否启用串行全表扫描下的直接路径读取(direct path read),其默认值为AUTO,设置为NEVER时禁用11g自动direct path read的特性
“As of 11.2.0.2 the legal settings are
true, false, always, auto, and never
true is the same effect as always
false is the same effect as auto
Default value is “auto”
Setting event 10949 or event 10354 may also have the side effect of making oracle behave as if _serial_direct_read = never”
该参数可以动态在实例或会话级别修改,而无需重启实例。
类似的10949 EVENT事件也可以起到类似的作用。
设置event 10949可以避免采用直接路径读取方式,该事件可以在线设置,但对现有session可能不会生效:
在实例级别设置:
ALTER SYSTEM SET EVENTS ‘10949 TRACE NAME CONTEXT FOREVER’;
设置到SPFILE中:
alter system set event=’10949 TRACE NAME CONTEXT FOREVER’ scope=spfile;
在session级别设置:
ALTER SESSION SET EVENTS ‘10949 TRACE NAME CONTEXT FOREVER’;
转载自刘向兵老师:http://www.askmaclean.com/archives/11g-direct-path-read-10949-_small_table_threshold-_serial_direct_read.html
11g直接路径读、相关参数、10949事件介绍的更多相关文章
- 创建一个python类 ,self init相关参数的简单介绍
一 创建 ''' 一 使用python 语法 创建一个类, 探究self 是干啥的 1 创建一个对象 car 2 写入两个行参 3 定义两个方法 ''' class Car(): ''' 二 init ...
- [20171120]11G关闭直接路径读.txt
[20171120]11G关闭直接路径读.txt --//今天做filesystemio_options参数测试时,遇到一个关于直接路径读的问题.--//如果看以前的博客介绍,设置"_ser ...
- direct path read/write (直接路径读/写)
转载:http://www.dbtan.com/2010/04/direct-path-readwrite.html direct path read/write (直接路径读/写): 直接路径读(d ...
- Oracle收集对表收集统计信息导致全表扫描直接路径读?
direct path read深入解析 前言 最近碰到一件很奇葩的事情,因为某条SQL执行缓慢,原因是走了笛卡尔(两组大数据结果集),而且笛卡尔还是NL的一个部分,要循环31M次. 很容易发现是统计 ...
- JVM相关参数配置和问题诊断<转>
原文连接:http://blog.csdn.net/chjttony/article/details/6240457 1.Websphere JVM相关问题诊断: 由JVM引起的Websphere问题 ...
- Oracle 直接路径读
在11g中,全表扫描可能使用direct path read方式,绕过buffer cache,这样的全表扫描就是物理读了. 在10g中,都是通过gc buffer来读的,所以不存在direct pa ...
- MySQL8常见客户端和启动相关参数
MySQL8常见客户端和启动相关参数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL常见的客户端 1>.使用MySQL服务自带的mysql连接工具 2>. ...
- Linux TCP队列相关参数的总结 转
在Linux上做网络应用的性能优化时,一般都会对TCP相关的内核参数进行调节,特别是和缓冲.队列有关的参数.网上搜到的文章会告诉你需要修改哪些参数,但我们经常是知其然而不知其所以然,每次照抄过 ...
- Linux TCP队列相关参数的总结
作者:阿里技术保障锋寒 原文:https://yq.aliyun.com/articles/4252 摘要: 本文尝试总结TCP队列缓冲相关的内核参数,从协议栈的角度梳理它们,希望可以更容易的理解和记 ...
随机推荐
- 20175126《Java程序设计》第四周学习总结
# 20175126 2016-2017-2 <Java程序设计>第四周学习总结 ## 教材学习内容总结 - 本周学习方式主要为手动敲打教材代码和观看APP上的视频资源自学. - 学习内容 ...
- python3作业:模拟登录
__author__ = "bin007" customer = {}#存储用户信息#处理用户信息文件try: with open('login.txt','r',encoding ...
- 51单片机学习笔记(郭天祥版)(6)——键盘的作业题、AD、DA、DS18B20(这里之后看清翔的补一下好了)
A:analog,D:digital AD,就是模拟量转换为数字量,DA就是数字量转换为模拟量 为什么要转换? 单片机是数字芯片,内部只有0和1,没法表示模拟量 比如我们如果需要2.5V怎么办?其实是 ...
- java_31 数据表的操作
1.主键约束 特点非空,只用于表示当前的记录. 设置主键:create table 表名(sid int primary key); 删除主键:alter table 表名 drop primary ...
- BundleConfig某js文件 全部打包
var server = HttpContext.Current.Server; var jsFiles = System.IO.Directory.GetFiles(server.MapPath(& ...
- stm32-arduino-f103
希望给工作中偶尔要用的一些辅助板卡(例如运行信息现场记录)找一个快速开发的手段,Arduino作为流行的开源嵌入硬件框架,组件丰富,资料众多,所以想以Arduino作为平台.但是Arduino板子基本 ...
- 探索未知种族之osg类生物---状态树与渲染树以及节点树之间的关系
节点树 首先我们来看一个场景构建的实例,并通过它来了解一下“状态节点”StateGraph 和“渲染叶”RenderLeaf 所构成的状态树,“渲染台”RenderStage 和“渲染元”Render ...
- JSP 页面中插入图片
第一步 在 JSP 页面中插入图片 EL 表达式 ${pageContext.request.contextPath } 的值为当前的项目名称 <html> ... <body> ...
- 腾讯开源的 Paxos库 PhxPaxos 代码解读---Accept阶段(一)
腾讯开源的 Paxos库 PhxPaxos 代码解读---Accept阶段(一) 在看Accept阶段代码之前, 我们再回想一下 Basic Paxos算法; 1. Basic Paxos 算法是为 ...
- centos/RHEL 7.6 使用yum安装php7.3(方便wordpress的php7.3需求,并解决了libphp7.so缺失问题)
我最近想安装一个wordpress, 但是官网介绍需要php7.3以上版本,但是百度了一下,都是要编译安装. 为此,我想,centos..., php... 两大当红辣子鸡没有yum安装方式,简直不可 ...