正德厚生,臻于至善

oracle 11g禁用和强制direct path read

除了exadata,其余平台可以作为一个规范关闭-盛杰

How To Force Direct Path Read for SQL Statements (Doc ID 2426051.1)

Exadata Smartscan Is Not Being Used On Insert As Select (Doc ID 1348116.1)

根因分析:
有个隐含参数_serial_direct_read,决定direct path read的使用方式,默认是auto(共有false, true, never, auto, always几个选项),auto方式下有下面几个已知触发条件:
表大小超过 _small_table_threshold 隐含参数设置的阀值
表在buffer cache块数低于50%
表脏块数低于的25%
上面几个条件,只要有一个不满足,都不会使用Direct path read。频繁使用的大表,达到_small_table_threshold 阀值后,因为仍有大量数据在buffer cache,不会立即触发Direct path read,但是如果遇到其他大表挤占了buffer cache,buffer cache块数低于50%,就满足了触发条件。
(注:另外还有一个参数_very_large_object_threshold,默认值500,即表大小超过5倍_db_block_buffers时,也会选择direct path read,这里不多解释)
上面SQL的触发时间点是统计信息收集时段,表数据块在buffer cache的量减少,触发了Direct path read后,就很难再回到从前了。除非对表“瘦身”,简单的delete还不行,必须是高水位的降低(truncate或delete +shrink)。文章最后有改参数的方法。
--alter system set event='10949 TRACE NAME CONTEXT FOREVER, level 1' scope=spfile; 
--SQL> alter system set "_serial_direct_read"=false scope=both sid='*'; 
SQL> alter system set "_serial_direct_read"=never scope=both sid='*'; 
SQL> set lines 200 pages 50000
col name for a40
col value for a10
col describ for a60
SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ
  FROM SYS.x$ksppi x, SYS.x$ksppcv y
 where x.indx = y.indx
   AND (x.ksppinm = '_small_table_threshold' or
       x.ksppinm = '_serial_direct_read' or x.ksppinm = '_direct_read_decision_statistics_driven');

有两种方法来对SQL语句强制direct path reads。
1. 对SQL语句使用PARALLEL hint如 /*+ parallel(4) */,并行会使用direct path read。
2. 手工修改SQL中涉及的表的统计信息,使表的块数>_small_table_threshold来启用串行direct path read。

https://www.cnblogs.com/zhjh256/p/9506247.html

https://cloud.tencent.com/developer/article/2028225

https://www.modb.pro/db/25067

赞(0) 打赏
未经允许不得转载:徐万新之路 » oracle 11g禁用和强制direct path read

评论 抢沙发

联系我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫

微信扫一扫

登录

找回密码

注册