Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1450750
  • 博文数量: 239
  • 博客积分: 5909
  • 博客等级: 大校
  • 技术积分: 2715
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-24 20:19
文章分类

全部博文(239)

文章存档

2014年(4)

2013年(22)

2012年(140)

2011年(14)

2010年(59)

我的朋友

分类: Oracle

2012-06-19 22:12:35

在11g中,全表扫描可能使用direct path read方式,绕过buffer cache,这样的全表扫描就是物理读了. 在10g中,都是通过gc buffer来读的,所以不存在direct path read的问题。 

 direct path read较高的可能原因有:

1. 大量的磁盘排序操作,order by, group by, union, distinct, rollup, 无法在PGA中完成排序,需要利用temp表空间进行排序.  当从临时表空间中读取排序结果时,会产生direct path read.

2. 大量的Hash Join操作,利用temp表空间保存hash区。

3. SQL语句的并行处理 

4. 大表的全表扫描,在中,全表扫描的算法有新的变化,根据表的大小、高速缓存的大小等信息,决定是否绕过SGA直接从磁盘读Oracle11g取数据。而10g则是全部通过高速缓存读取数据,称为table scan(large)。11g认为大表全表时使用直接路径读,可能比10g中的数据文件散列读(db file scattered reads)速度更快,使用的latch也更少。 

大量的direct path read等待时间最可能是一个应用程序问题. direct path read事件由SQL语句驱动,这些SQL语句执行来自临时的或常规的表空间的直接读取操作.  当输入的内容大于PGA中的工作区域时,带有需要排序的函数的SQL语句将排序结果写入到临时表空间中,临时表空间中的排序顺序串随后被合并,用于提供最终的结果。读取排序结果时,Oracle会话在direct path read等待事件上等待。DB_FILE_DIRECT_IO_COUNT初始化参数可能影响direct path read的性能。

一个隐含参数:

_serial_direct_read = false  禁用direct path read
_serial_direct_read = true   启用direct path read

alter sytem set "_serial_direct_read"=never scope=both sid='*'; 可以显著减少direct path read

阅读(7706) | 评论(3) | 转发(0) |
1

上一篇:Oracle中的锁机制

下一篇:Linux中的dd命令

给主人留下些什么吧!~~

zengmuansha2014-05-21 11:36:56

怎么抓取 直接路径读取的SQL

zengmuansha2014-05-21 11:36:55

怎么抓取 直接路径读取的SQL

PubToner2014-05-13 10:19:23

文明上网,理性发言...