11g新特性: OLTP中的Adaptive Direct Read算法
Kaya 发表于 os2ora.com
direct read是直接把数据块读到PGA的一种操作,在并行查询中这是唯一的模式。这明显地区别于非并行查询把数据块读到SGA的做法。读到SGA的目的主要是为了共享,这特别适用于OLTP场合。不过,与此同时,访问SGA会引入更多的latch等待,例如cache buffer chains, cache buffer lru等等。
在非并行查询中也可以使用direct read,可以通过一个隐含参数_serial_direct_read进行设置。
值得注意,_serial_direct_read对解析过程起作用,这意味着为了使_serial_direct_read对当前运行中的SQL起作用,我们必须先flush当前的shared_pool。
11g中,Oracle有了一个自适应的算法决定是否对serial execution启用direct read。不过,这是在运行时才决定的。它取决于多个统计信息,例如当前buffer cache的大小,_small_table_threshold的大小,当前dirty blocks还占的比例等等。因此,即使在11g中_serial_direct_read的值为false,serial direct read也可能起作用。这个算法其实就叫做Adaptive Direct Read.
下面是两个模式对资源的利用情况对比:
| direct read | traditional way | |
| consistent gets | 80,577 | 80,589 |
| physical reads direct | 80,498 | 0 |
| cache buffers chains | 395 | 161,029 |
| wait events | ‘cell smart table scan’ | ‘cell multiblock physical read’ ‘gc cr multi block request’ |
当使用direct read时,cache buffers chains明显减少,但物理读每次都保持恒定。对于传统方法,物理读只发生在第一次执行时。
对于等待事件也有所不同,direct read的等待事件是’cell smart table scan’,而非direct read的等待事件是’cell multiblock physical read’。这体现出Exadata的独有的优势: direct read可以利用Exadata的smart scan功能,从而实现把DB节点的CPU负载offload到存贮节点上。
一些Tips:
利用下面这个event 可以disable 这个特性:
alter session set events '10949 trace name context forever, level 1';

exadata 用于DW, 基本上用direct path read么? 如果是, 每次direct path read都会触发 checkpoint,如果有大量的update, 同时有多个并发query, checkpoin 会成为瓶颈么?
DW一般都采用并行查询,所以基本上采用的是direct path read。一个checkpoint操作的代价对于一个大查询来说代价其实微乎其微。
[...] http://www.os2ora.com/11g-new-feature-adaptive-direct-read/ 11g新特性: OLTP中的Adaptive Direct Read算法 国内Oracle Real Performance Team的一个工程师写的关于此的介绍, 细节上不如上一个. [...]
[...] OS与Oracle ” 11g新特性: OLTP中的Adaptive Direct Read算法 它取决于多个统计信息,例如当前buffer cache的大小,_small_table_threshold的大小,当前dirty blocks还占的比例等等。 因此,即使在11g中_serial_direct_read的值为false,serial direct read也可能起作用。 … [...]