在jonathon lewis里的博客里,找到了一个链接,证明了满足direct path read的阀值,他的博客里还提到了11GR2的变化。第一篇证明阀值的思路非常好,非常值得阅读,可能需要翻墙才能看。
http://afatkulin.blogspot.com/2009/01/11g-adaptive-direct-path-reads-what-is.html
http://afatkulin.blogspot.com/2012/07/serial-direct-path-reads-in-11gr2-and.html
| 11GR1 | 11GR2 | 备注 |
块阀值 | _small_table_threshold*5 | _small_table_threshold | 统计信息里记录的表的block数目(11GR2)超过此阀值。 |
Block cache阀值 | 50% | 50% | 少于此阀值 |
脏块阀值 | 25% | 25% | 少于此阀值 |
特别注意第一个阀值,参照的是统计信息里的表的block数,而不是dba_segments里的。如果你的统计信息不准确,很可能导致扫描路径变为direct path read(统计信息值过大),或者怎么都走不上direct path read(统计信息值过小)
设置这三个阀值非常的合理:
第一个阀值:表大小,太小的表从direct path read中的获益太小
第二个阀值:表在内存里的cache率,如果cache率很高,那么还是走传统路径更快
第三个阀值:脏块阀值,由于direct path read需要出发一个段的检查点,因此脏块太多,刷新脏块可能会导致IO繁忙
不过悲剧的是,即使你了解了能有效控制direct path read的这些阀值,但是大多数时候,你还是显得很无助,因为如果你的生产环境的某张表不满足其中某个条件,你都不太可能去更改这些阀值(你敢修改_small_table_threshold?你敢alter system flush buffer_cache?)
PS:我粗略的做了实验,ORACLE似乎对脏块的比例比较敏感,能立即修正执行计划,但是对block cache的变化不敏感,有时候表的大部分数据已经被cache了,但是执行计划依然会选择走dpr。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22034023/viewspace-762470/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/22034023/viewspace-762470/