I/O上的等待事件 —— direct path read、direct path write

时间:2023-01-27 07:53:29

direct path read

direct path read事件的等待是在执行Parallel Query时,Slave Session所执行的direct path I/O引发的。

SQL> select event#,name,parameter1,parameter2,parameter3 from v$event_name where name = 'direct path read';

    EVENT# NAME                           PARAMETER1      PARAMETER2 PARAMETER3
---------- ------------------------------ --------------- ---------- ----------
       163 direct path read               file number     first dba  block cnt
这个等待事件有三个参数。
file number:数据块所在数据文件的文件号。
first dba:起始数据块号。
block cnt:数据块数目。

Slave Session(从属会话)在执行direct path read期间,Coordinator Session(协调会话)等待从Slave Session(从属会话)的响应,可通过对PX Deq: Execute Reply事件的等待现象进行观察。执行Parallel Query时发生direct path read等待是必然结果。如果direct path read事件的等待时间过长,就应该在如下方面寻找调优点。


提高Parallel Query本身性能。执行Parallel Query过程中的direct path read等待是必然结果,调优这个等待事件本事是不可能的,而通过对sql进行调优,改善Parallel Query本身性能是恰当的解决方式。对于数据文件执行直接读取工作之前,应该将读取的对象所在脏块写入入到数据文件上。即,会发生检查点。执行这个工作期间Coordinator Session将经历enq: TC - contention等待。
提高I/O系统本身的性能。
使用direct path I/O时,因为没有经过高速缓冲区,如发生高速缓冲区相关的争用时,就可以考虑使用它。如将FTS替换为Parallel Query,因为不经过高速缓冲区,所以与此相关的等待现象也将消失。但使用Parallel Query时,也可能发生CPU和内存使用量增加、检查点工作增加等负面影响,所以要慎重考虑后使用。


direct path write

direct path write等待意味着发生了Direct load工作(CTAS:Create Table As Select,insert /*+ append */ ... 等)。这些工作被请求时,oracle将不经过SGA在数据文件上执行直接写入工作。即,不是通过DBWR实现写入工作,而是通过服务器进程实现写入工作。CTAS(Create Table As Select)或insert /*+ append */,Direct模式执行SQL*Loader时执行Direct load工作,这些工作具有如下特点。
不经过SGA,在数据文件上执行直接写入。
在HWM之后添加(append)块。
对于添加的数据不创建回滚段。
表里有nologging选项时,不生成重做记录。
对于表以Exclusive模式获得TM锁,因此不允许其他会话上的DML。

SQL> select event#,name,parameter1,parameter2,parameter3 from v$event_name where name = 'direct path write';

    EVENT# NAME                           PARAMETER1      PARAMETER2 PARAMETER3
---------- ------------------------------ --------------- ---------- ----------
       165 direct path write              file number     first dba  block cnt
这个等待事件有三个参数。
file number:数据块所在数据文件的文件号。
first dba:起始数据块号。
block cnt:数据块数目。

合理使用Direct load操作,就可以快速创建大量数据。通过并行Direct模式和Parallel模式,可将性能进一步最优化。以PCTAS(Parallel CTAS),insert /*+ append (alias degree) */或direct parallel模式执行SQL*Loader就是代表性例子。以Parallel模式创建数据时,oracle按如下方法使用。
各个Slave Session在表所属的表空间内创建临时段以存储数据(请注意,即便不是临时表空间,也会创建临时段)这是dba_segments.SEGMENT_TYPE列值是“TEMPORARY”。
各Slave Session在所创建的临时段在执行结束之后,合并为一个临时段。
执行提交之后,临时段合并为表段,HWM将被移动。
执行回滚后,临时段将被drop。
如果是Direct模式,数据将被直接写入到表的段,但是与Parallel模式并行时,暂时直接写入到表所属的永久表空间内的临时段后,在所有工作成功结束之后再合并到表段上。
执行Direct load工作时发生direct path write等待是必然的,而且不能减少等待的发生。但如果direct path write事件的平均等待时间过高,就可以判断为文件系统本身的性能存在问题。


注意:

在Oracle 10g中,为了区分对于临时文件的直接读写操作,Oracle对 direct path read/write 进行了分离,将这类操作分离出来。

从下面可以知道 direct path read/write temp 就是单指对于临时文件的直接读写操作。

SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Prod
PL/SQL Release 10.2.0.4.0 - Production
CORE    10.2.0.4.0      Production
TNS for Linux: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production

SQL> select event#,name,wait_class from v$event_name where name like 'direct%';

    EVENT# NAME                                                             WAIT_CLASS
---------- ---------------------------------------------------------------- ----------
       163 direct path read                                                 User I/O
       164 direct path read temp                                            User I/O
       165 direct path write                                                User I/O
       166 direct path write temp                                           User I/O