与IO相关的等待事件troubleshooting-系列6

'db file parallel read'

        当Oracle从多个数据文件并行读到内存(PGA或Buffer Cache)的非连续缓冲时,可以看到这种等待事件。在恢复操作或为了优化而预处理缓冲(代替执行多个单块读)时也会有这种等待事件。

        如果这种等待事件的事件占据大部分,可以按照“db file sequential read”的处理方法。


Direct Path Reads and Writes

直接路径读与写


'direct path read'

Document 50415.1WAITEVENT: "direct path read" Reference Note


'direct path write'

Document 50416.1 WAITEVENT: "direct path write" Reference Note


'direct path read (lob)'

'direct path write (lob)'


        当数据库进程在磁盘与进程PGA内存之间执行一些特殊类型的多块IO操作时,会出现这种等待事件,这种操作会绕过Buffer Cache。可以同步或异步两种方式执行这样的IO操作。

       使用这种方式的一些例子:

1. 当内存排序区满了,使用临时表空间排序时,对IO的排序操作。

2. 并行执行(查询和DML)。

3. 预读操作(buffer预处理)。

4. 直接读取操作。

5. 对LOB段的IO操作(LOB段不会缓存到Buffer Cache)。

        用这种方式中等待的时间都会被记录(不会衡量用于执行IO操作的时间),但不能用Statspack的“Top 5 Wait/Timed Events”节中列表的相对位置来评估他们的真实影响。

        调优的纲领:

1. 建议使用异步IO。

2. 在Oracle 8i,通过设置DB_FILE_DIRECT_IO_COUNT实例参数最小化IO请求数量,DB_BLOCK_SIZE x DB_FILE_DIRECT_IO_COUNT = 系统的max_io_size。

        在Oracle 8i中,默认值是64个块。

        (在Oracle 9i,他被_DB_FILE_DIRECT_IO_COUNT参数取代,这个参数控制以字节(不是块)为单位的直接IO容量)。默认值是1Mb,但是如果系统的max_io_size更小,那默认值也会被缩小。

        可参考:Document 47324.1 Init.ora Parameter "DB_FILE_DIRECT_IO_COUNT" Reference Note。

3. 调整内存排序区,以使磁盘排序的磁盘IO最小化。

        在9i之前,使用自动SQL执行内存管理。(Document 147806.1 Automated SQL Execution Memory Management)

        在8i,手动调整不同的排序区。(Document 109907.1 How to Determine an Optimal SORT_AREA_SIZE)

4. 对于LOB段,可以存储到操作系统的文件系统中。

        Buffer Cache能够提供一些内存缓冲。

5. 通过查询V$SESSION_EVENT(等待事件)或V$SESSTAT(统计数据),明确执行直接IO操作的session。

 'physical reads direct', 'physical reads direct (lob)',

 'physical writes direct' & 'physical writes direct (lob)'

对这些SQL语句调优。

6. 根据V$FILESTAT或Statspack的“File IO Statistics”节,明确哪些数据文件是磁盘存储的瓶颈,将他们移到其他磁盘。


(未完待续)

上一篇:Flutter 组件之 CheckboxListTile


下一篇:与IO相关的等待事件troubleshooting-系列5