'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”节,明确哪些数据文件是磁盘存储的瓶颈,将他们移到其他磁盘。
(未完待续)