在Oracle 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

本案例:由于没有走索引,导致全表扫描,数据库event状态是direct path read

-- 查看sql session 执行情况

SELECT S.SID,S.LAST_CALL_ET,
(SELECT ST.VALUE FROM V$SESSTAT ST WHERE ST.SID = S.SID AND ST.STATISTIC# = TO_NUMBER('38') ) CRITERIA_VALUE,
S.BLOCKING_SESSION,S.BLOCKING_INSTANCE,S.BLOCKING_SESSION_STATUS,
(SELECT CASE WHEN NOT S.BLOCKING_SESSION IS NULL THEN 'kill -9 '|| GP.SPID ELSE NULL END FROM GV$PROCESS GP,GV$SESSION GS WHERE GS.PADDR = GP.ADDR AND GS.SID=S.BLOCKING_SESSION AND GS.INST_ID=GP.INST_ID ) KILL_BLOCK_PROC,
(SELECT CASE WHEN NOT S.BLOCKING_SESSION IS NULL THEN 'ALTER SYSTEM KILL SESSION '''|| GS.SID || ',' || GS.SERIAL# ||''' IMMEDIATE;' ELSE NULL END FROM GV$SESSION GS WHERE GS.SID=S.BLOCKING_SESSION AND GS.SID=S.BLOCKING_SESSION AND GS.INST_ID=S.BLOCKING_INSTANCE ) KILL_BLOCK_SESSION,
S.CLIENT_IDENTIFIER,S.SERVER,S.USERNAME,S.MACHINE,S.PROGRAM,S.MODULE,S.ACTION,
(SELECT AC.NAME
FROM ( SELECT ACTION, NAME FROM AUDIT_ACTIONS UNION SELECT 189, 'MERGE' FROM DUAL ) AC WHERE AC.ACTION = S.COMMAND + CASE WHEN S.COMMAND < 0 THEN 256 ELSE 0 END) COMMAND,
S.STATUS,S.LOCKWAIT,S.EVENT,S.STATE,S.WAIT_CLASS,S.WAIT_CLASS#,S.WAIT_TIME,T.EXECUTIONS,T.OPTIMIZER_MODE,T.OPTIMIZER_COST,T.CPU_TIME,T.DISK_READS,T.BUFFER_GETS,T.SORTS,T.SHARABLE_MEM,
T.PERSISTENT_MEM,T.RUNTIME_MEM,T.ROWS_PROCESSED,T.COMMAND_TYPE,O.OBJECT_ID,O.OBJECT_NAME,F.FILE_ID,F.FILE_NAME,F.TABLESPACE_NAME,
S.ROW_WAIT_BLOCK#,S.ROW_WAIT_ROW#,S.LOGON_TIME,T.SQL_TEXT,T.SQL_FULLTEXT,
'SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('''||T.SQL_ID||''','||T.CHILD_NUMBER||'));' PLAN,
'ALTER SYSTEM KILL SESSION ''' || S.SID || ',' || S.SERIAL# || ''' POST_TRANSACTION IMMEDIATE;' KILL_SESSION,
'SELECT SQL_TEXT,SQL_FULLTEXT,LAST_ACTIVE_TIME,DBMS_SQLTUNE.EXTRACT_BINDS(BIND_DATA) BIND FROM V$SQL WHERE SQL_ID='''||S.SQL_ID||''' ORDER BY LAST_ACTIVE_TIME DESC;' BIND
FROM V$SESSION S,V$SQL T,DBA_OBJECTS O,DBA_DATA_FILES F
WHERE S.SQL_HASH_VALUE = T.HASH_VALUE AND S.STATUS = 'ACTIVE' AND F.FILE_ID=ROW_WAIT_FILE# AND S.ROW_WAIT_OBJ#=O.OBJECT_ID
ORDER BY LAST_CALL_ET DESC;

  

Oracle 11g direct path read 等待事件的理解的更多相关文章

  1. oracle 11G direct path read 很美也很伤人

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

  2. oracle 11G direct path read 非常美也非常伤人

    direct path read 在11g中,全表扫描可能使用direct path read方式,绕过buffer cache,这种全表扫描就是物理读了. 在10g中,都是通过gc buffer来读 ...

  3. direct path write 等待事件导致数据库hang

    同事反应十几分钟前数据库好像挂起了一会,让我排查数据库是否存在什么问题. 第一反应看当前数据库还是否有什么等待事件,结果有direct path write等待事件. 于是抓了问题时间段20分钟的AS ...

  4. oracle 11g enq: JI – contention等待事件

    最近使用物化视图同步的环境在大量刷新的时候频繁出现enq: JI – contention等待事件,经查: JI enqueue is acquired in exclusive mode on th ...

  5. Oracle 常见的33个等待事件

    一. 等待事件的相关知识: 1.1 等待事件主要可以分为两类,即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件. 1). 空闲等待事件指Oracle正等待某种工作,在诊断和优化数据库的时 ...

  6. Oracle常见的几种等待事件

    1. CPU time CPU time其实不是真正的等待事件.是衡量CPU是否瓶颈的一个重要指标.一般来讲,一个良好的系统,CPU TIME 应该排在TOP 5 TIME Event的最前面. 当然 ...

  7. Oracle常见的33个等待事件

    Buffer busy waits 原因:        当一个会话试图修改一个数据块,但这个数据块正在被另一个会话修改时.        当一个会话需要读取一个数据块,但这个数据块正在被另一个会话读 ...

  8. 【Oracle】11g direct path read介绍:10949 event、_small_table_threshold与_serial_direct_read

    转自刘相兵老师的博文: http://www.askmaclean.com/archives/11g-direct-path-read-10949-_small_table_threshold-_se ...

  9. 【参考】查找Oracle最高的几个等待事件以及锁的信息

    1.通过操作系统的命令找到系统资源的bottleneck,如:CPU, Memory, I/O, Network  同时主要关注IOWait, PI/PO, Memory的使用情况 2.通过查询v$s ...

随机推荐

  1. xshell提示必须安装最新的更新

    今天大家的xshell基本都出了这个问题 调整时间,调整到比较前的时间,打开xshell即可. 然后工具->选项 把更新去了

  2. svn服务器搭建及使用(三)

    接下来,试试用TortoiseSVN修改文件,添加文件,删除文件,以及如何解决冲突等. 添加文件 在检出的工作副本中添加一个Readme.txt文本文件,这时候这个文本文件会显示为没有版本控制的状态, ...

  3. RabbitMQ fanout类型的Exchange

    就目前来说,Exchange是与消息发送端有关的,因为它可以指定将消息发送到哪个或哪些队列中. 本篇文章介绍的fanout类型就是指定将消息群发到与Exchange绑定的所有队列中. fanout这个 ...

  4. vue-7-表单

    示例: <input v-model="message" placeholder="edit me"> <p>Message is: { ...

  5. 上传本地代码到GitHub上

    由于经常忘记Git的相关代码,百度多了自然不耐烦,干脆自己写个简单的博客记录一下代码及流程了...... 1.在GitHub上新建一个仓库: 2.创建完后在仓库左上角的ssh上copy一下地址: 3. ...

  6. Linux系统命令行中vim编辑器取消高亮显示

    由于在使用vim编辑代码的时候不小心忘记首先输入i(insert)模式,导致写的代码出现了棕黄色的阴影显示 摸索了很久终于找到了解决方法: 1.退出vim编译器 2.在在命令行下输入:nohl,回车 ...

  7. Android : iperf-2.0.4 网络测试工具

    一.源码下载及交叉编译: 下载:https://pan.baidu.com/s/1i6NYDF3   //包含linux和windows上的可执行文件 1. 解压后获得perf-2.0.4源码.2. ...

  8. SQL-37 创建索引

    题目描述 针对如下表actor结构创建索引:CREATE TABLE IF NOT EXISTS actor (actor_id smallint(5) NOT NULL PRIMARY KEY,fi ...

  9. 浅议APC

    0x01  APC中断请求级别   在Intel x86体系结构中,外部硬件中断是通过处理器上的"中断管脚"或者一个称为"本地APIC(local APIC)" ...

  10. .NET界面控件DevExpress发布v18.2.4|附下载

    DevExpress Universal Subscription(又名DevExpress宇宙版或DXperience Universal Suite)是全球使用广泛的.NET用户界面控件套包,De ...