Oracle等待事件db file parallel read

SQL> select event#,name,parameter1,parameter2,parameter3 from v$event_name where name = ‘db file parallel read‘;  

    EVENT# NAME                           PARAMETER1      PARAMETER2      PARAMETER3
---------- ------------------------------ --------------- --------------- ---------------
       120 db file parallel read          files           blocks          requests  

1. db file parallel read

Contrary to what the name suggests, the db file parallel read event is not related to any parallel 
operation—neither parallel DML nor parallel query. This event occurs during the database recovery 
operation when database blocks that need changes as a part of recovery are read in parallel from the 
datafiles. This event also occurs when a process reads multiple noncontiguous single blocks from 
one or more datafiles.

Wait Parameters 
Wait parameters for db file parallel read are described here: 
l P1 Number of files to read from 
l P2 Total number of blocks to read 
l P3 Total number of I/O requests (the same as P2 since multiblock read is not used)

Wait Time 
No timeouts. The session waits until all of the I/Os are completed.

案例

http://www.itpub.net/thread-1586802-1-1.html

虽然执行计划正确,但是由于index的聚合因子过高,导致prefetch功能大量预读取数据.

一个语句执行计划没有问题,单独提取出来执行只要0.8秒。但是放到存储过程中就很慢 需要10秒左右甚至更多。

Execution Plan

Id Operation Name Rows Bytes Cost (%CPU) Time
0 SELECT STATEMENT       1839 (100)  
1    SORT AGGREGATE   1 37    
2      FILTER          
3        TABLE ACCESS BY INDEX ROWID V_RPT_PLYEDR_INSRNC 1 37 1839 (1) 00:00:23
4          INDEX RANGE SCAN ACIF_INDEX_001 2147   18 (0) 00:00:01

但是带入数据单独这个语句执行计划一样的情况下,只要1秒左右。应该不是绑定变量导致的执行计划问题,因为可以看到执行计划是最优的,我查看了等待事件
       491 db file parallel read                                                   2041
       491 db file sequential read                                                 526
       491 db file scattered read                                                   23

SQL> select distinct(file_id) from dba_extents where segment_name=‘V_RPT_PLYEDR_INSRNC‘; FILE_ID
----------
        25
        22

SQL> select name from v$datafile  where file# in (‘22‘,‘25‘);

NAME
--------------------------------------------------------------------------------
/repdata/ora9i/CIRCI.dbf
/repdata/ora9i/circi01.dbf 

Top 5 Timed Events

Event Waits Time(s) Avg Wait(ms) % Total Call Time Wait Class
db file parallel read
351,880


2,891


8


68.3

User I/O
db file sequential read
463,984


1,216


3


28.7

User I/O
CPU time   184

  4.4

 
log file parallel write
1,346


3


2


.1

System I/O
db file parallel write
512


3


6


.1

System I/O

File IO Stats

  • ordered by Tablespace, File
Tablespace Filename Reads Av Reads/s Av Rd(ms) Av Blks/Rd Writes Av Writes/s Buffer Waits Av Buf Wt(ms)
CIRCI /repdata/ora9i/CIRCI.dbf
2,847,514


787


12.59


1.02


1,258


0


3


20.00

CIRCI /repdata/ora9i/circi01.dbf
915,158


253


8.63


1.00


13


0


0


0.00

REPORT /repdata/ora9i/REPORT01.dbf
257,679


71


0.75


15.15


0


0


186,811


0.45

REPORT /repdata/ora9i/REPORT02.dbf
255,701


71


0.71


15.21


0


0


187,164


0.43

REPORT /repdata/ora9i/REPORT03.dbf
135,105


37


0.72


15.35


0


0


125,856


0.39

Av Rd(ms) 过大 排除 整列本生有问题,是否和 集群因子过大导致通过ROWID寻找TABLE ROWS时跳跃过大有关?

结果显示集群因子相当的大,表中一共3000多W调数据 集群因子达到2600W,但是索引的DISTINCT值确只有846,表只是批量的进行INSERT

所以是否可以考虑如下的方法

1、建立BITMAP索引代替以前爱的B-TREE索引

2、或者建立一个大的联合索引,让查询直接走INDEX FAST FULL SCAN。

3、同时建立一个新的表空间来存放索引,做好把TABLE也MOVE到新建的表空间中。

我已经建立了联合索引。效果灰常好。已经不通过TABLE ACCESS BY INDEX ROWID 了。只扫描索引就好了。

新的Execution Plan 如下:

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2161530321
----------------------------------------------------------------------------
| Id  | Operation         | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |        |     1 |    37 |   156   (1)| 00:00:02 |
|   1 |  SORT AGGREGATE   |        |     1 |    37 |            |          |
|*  2 |   INDEX RANGE SCAN| TEST01 |     2 |    74 |   156   (1)| 00:00:02 |

原理:

高聚簇因子 index range scan -----> 引发灰常多的 rowid 回表扫描离散的block ------>buffer prefetching(11G) ------------> db file parallel read...

当 db 出现过多的 db file parallel read 优化SQL 去吧。

案列二:

http://yangtingkun.net/?p=695  消除11.2上的db file parallel read

客户在11.2.0.3环境中进行压力测试,发现出现大量的db file parallel read等待事件。
这个等待是11g以后才出现的,而在11g以前,一般这个等待事件发生在数据文件的恢复过程中。而11g新增了prefetch的特性,也可能导致这个等待事件的产生。
当运行压力测试时,后台的等待事件如下:

SQL> SELECT event, COUNT(*) FROM v$session WHERE username = USER GROUP BY event ORDER BY 2;
EVENT                                                              COUNT(*)
---------------------------------------------------------------- ----------
SQL*Net message FROM client                                               1
SQL*Net message TO client                                                 1
db file sequential READ                                                  24
db file scattered READ                                                   33
db file parallel READ                                                    42

可以看到用户进程经历比较严重的IO等待,而此时的db file parallel read,并不会带来性能提升。
可以通过添加隐含参数的方法来屏蔽prefetch功能,从而避免db file parallel read等待事件的产生:

_db_block_prefetch_limit=0
_db_block_prefetch_quota=0
_db_file_noncontig_mblock_read_count=0

修改这三个隐藏参数后,发现db file parallel read等待事件已经消失:

SQL> SELECT event, COUNT(*) FROM v$session WHERE username = USER GROUP BY event ORDER BY 2;
EVENT                                                              COUNT(*)
---------------------------------------------------------------- ----------
SQL*Net message TO client                                                 1
db file scattered READ                                                   30
db file sequential READ                                                  70
时间: 2024-10-07 21:44:03

Oracle等待事件db file parallel read的相关文章

Oracle db file parallel write 和 log file parallel write 等待事件

一. db file parallel write等待事件 引自如下blog: http://oradbpedia.com/wiki/Wait_Events_-_db_file_parallel_write db文件并行写 db文件并行写等待事件属于Oracle数据库写入程序(DBWR)进程,因为它是将块从SGA写入数据文件的唯一进程.当是写入时,DBWR进程编译一组脏块,将批处理交给操作系统,并等待db文件并行写事件以完成I / O.虽然用户会话从来没有遇到db文件并行写等待事件,但这并不意味

Oracle 等待事件之 db file parallel read

db file parallel read 官网解释: This happens during recovery. It can also happen during buffer prefetching, as an optimization (rather than performing multiple single-block reads). Database blocks that need to be changed as part of recovery are read in p

oracle之 等待事件LOG FILE SYNC (awr)优化

log file sycn是ORACLE里最普遍的等待事件之一,一般log file sycn的等待时间都非常短 1-5ms,不会有什么问题,但是一旦出问题,往往都比较难解决.什么时候会产生log file sync等待?常见有以下几种:1)commit操作2)rollback操作3)DDL操作(DDL操作实施前都会首先进行一次commit)4)DDL操作导致的数据字典修改所产生的commit5)某些能递归修改数据字典的操作:比如查询SEQ的next值,可能会导致修改数据字典.一个典型的情况是,

Oracle Study之--Oracle等待事件(5)

Oracle Study之--Oracle等待事件(5)  Db file single write这个等待事件通常只发生在一种情况下,就是Oracle 更新数据文件头信息时(比如发生Checkpoint).当这个等待事件很明显时,需要考虑是不是数据库中的数据文件数量太大,导致Oracle 需要花较长的时间来做所有文件头的更新操作(checkpoint).这个等待事件有三个参数:File#: 需要更新的数据块所在的数据文件的文件号.Block#: 需要更新的数据块号.Blocks: 需要更新的数

oracle等待事件的相关知识

一. 等待事件的相关知识: 1.1 等待事件主要可以分为两类,即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件. 1). 空闲等待事件指ORACLE正等待某种工作,在诊断和优化数据库的时候,不用过多注意这部分事件. 2). 非空闲等待事件专门针对ORACLE的活动,指数据库任务或应用运行过程中发生的等待,这些等待事件是在调整数据库的时候需要关注与研究的. 在Oracle 10g中的等待事件有872个,11g中等待事件1116个. 我们可以通过v$event_name 视图来查看等待

oracle等待事件以及解决方案

我们可以通过视图v$session_wait来查看系统当前的等待事件,以及与等待事件相对应的资源的相关信息,从而可确定出产生瓶颈的类型及其对象. v$session_wait的p1.p2.p3告诉我们等待事件的具体含义,根据事件不同其内容也不相同,下面就一些常见的等待事件如何处理以及如何定位热点对象和阻塞会话作一些介绍. <1> db file scattered read DB 文件分散读取 (太多索引读,全表扫描-----调整代码,将小表放入内存)这种情况通常显示与全表扫描相关的等待.当全

Oracle等待事件详解

一. 等待事件的相关知识:1.1 等待事件主要可以分为两类:即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件.1). 空闲等待事件指ORACLE正等待某种工作,在诊断和优化数据库的时候,不用过多注意这部分事件.2). 非空闲等待事件专门针对ORACLE的活动,指数据库任务或应用运行过程中发生的等待,这些等待事件是在调整数据库的时候需要关注与研究的.在Oracle 10g中的等待事件有872个,11g中等待事件1116个. 我们可以通过v$event_name 视图来查看等待事件的相

Oracle Study之--Oracle等待事件(8)

Oracle Study之--Oracle等待事件(8)      库缓存中的对象在库缓存中被切割成多个内存块,另有一个对象句柄记录了各个内存块的地址和其他的一些信息.当你要修改句柄中的信息时,需要在句柄上加独占锁,而如果另一个进程恰好在这时要求读.写句柄中的信息,它就必须等待.此时的等待就被Oracle记入Library cache lock事件.而读.写对象内存块也是无法同时进行的,有人如果正在写,你的读操作就必须等待,读写内存块的等待事件就是Library cache pin.如果这两个等

Oracle Study之--Oracle等待事件(3)

Oracle Study之--Oracle等待事件(3) Db file parallel read这是一个很容易引起误导的等待事件,实际上这个等待事件和并行操作(比如并行查询,并行DML)没有关系. 这个事件发生在数据库恢复的时候,当有一些数据块需要恢复的时候,Oracle会以并行的方式把他们从数据文件中读入到内存中进行恢复操作.这个等待事件包含三个参数:Files: 操作需要读取的文件个数.Blocks: 操作需要读取的数据块个数.Requests: 操作需要执行的I/O次数. 案例分析: