除了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
最新评论
这个牛
放下欲望,男人从来不醉,充分且必要
勇气、责任、自信、创新,为天下先!
软件即数据,软件即服务,软件即管理,软件就是对人类各种社会活动的仿真和记录。软件很重要,但软件不可能凌驾于业务之上,尤其不可能高人一等。