重庆思庄Oracle、Redhat认证学习论坛

标题: 关闭Direct Path Read [打印本页]

作者: jiawang    时间: 2024-11-15 14:14
标题: 关闭Direct Path Read
在Oracle Database 11g中有一个新特性,全表扫描可以通过直接路径读的方式来执行(Direct Path Read),这是一个合理的变化,如果全表扫描的大量数据读取是偶发性的,则直接路径读可以避免大量数据对于Buffer Cache的冲击。


当然对于小表来说,Oracle允许通过Buffer Cache来进行全表扫描,因为这可能更快,也对性能影响不大。
小表受到隐含参数:_small_table_threshold 影响。如果表大于 5 倍的小表限制,则自动会使用DPR替代FTS。
可以设置初始化参数: _serial_direct_read 来禁用串行直接路径读。


当然,Oracle通过一个内部的限制,来决定执行DPR的阈值。
可以通过设置10949事件屏蔽这个特性,返回到Oracle 11g之前的模式上:


alter session set events ‘10949 trace name context forever, level 1’;


还有一个参数 _very_large_object_threshold 用于设定(MB单位)使用DPR方式的上限,这个参数需要结合10949事件共同发挥作用。
10949 事件设置任何一个级别都将禁用DPR的方式执行FTS,但是仅限于小于 5 倍 BUFFER Cache的数据表,同时,如果一个表的大小大于 0.8 倍的 _very_large_object_threshold 设置,也会执行DPR。


这些限定的目标在于:
对于大表的全表扫描,必须通过Direct Path Read方式执行,以减少对于Buffer Cache的冲击和性能影响。
但是我们可以通过参数调整来决定执行DPR的上限和下限。


Event 10949 可以在线设置,但对现有session可能不会生效,新登录的会话会执行新的设置:


在实例级别修改参数设置:


ALTER SYSTEM SET EVENTS ‘10949 TRACE NAME CONTEXT FOREVER’;


增加参数到SPFILE中:


alter system set event=‘10949 TRACE NAME CONTEXT FOREVER’ scope=spfile;


对当前会话设置:


ALTER SESSION SET EVENTS ‘10949 TRACE NAME CONTEXT FOREVER’;
隐含参数"_serial_direct_read" 可以达到类似的限制,其默认值为AUTO,设置为NEVER时禁用 11g 的自动direct path read的特性。
该参数可以动态在实例或会话级别修改,而无需重启实例。


SQL> alter system set “_serial_direct_read”=auto;
SQL> alter system set “_serial_direct_read”=never;






欢迎光临 重庆思庄Oracle、Redhat认证学习论坛 (http://bbs.cqsztech.com/) Powered by Discuz! X3.2