zhuqibs
作者zhuqibs2020-04-26 12:31
软件开发工程师, Adidas

Oracle DBA应知应会 -- _serial_direct_read

字数 1189阅读 1455评论 0赞 6

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';

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

6

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广