oracle非空闲等待,oracle非空闲的等待事件-direct path read

direct path read(USER I/0类)

与直接读取相关联的等待事件。当ORACLE将数据块直接读入会话的PGA(进程全局区)中,同时绕过SGA(系统全局区)。PGA中的数据并不和其他的会话共享。即表明,读入的这部分数据该会话独自使用,不放于共享的SGA中。

在排序操作(order by/group by/union/distinct/rollup/合并连接)时,由于PGA中的SORT_AREA_SIZE空间不足,造成需要使用临时表空间来保存中间结果,当从临时表空间读入排序结果时,产生direct path read等待事件。

使用HASH连接的SQL语句,将不适合位于内存中的散列分区刷新到临时表空间中。为了查明匹配SQL谓词的行,临时表空间中的散列分区被读回到内存中(目的是为了查明匹配SQL谓词的行),ORALCE会话在direct path read等待事件上等待。

使用并行扫描的SQL语句也会影响系统范围的direct path read等待事件。在并行执行过程中,direct path read等待事件与从属查询有关,而与父查询无关,运行父查询的会话基本上会在PX Deq:Execute Reply上等待,从属查询会产生direct path read等待事件。

直接读取可能按照同步或异步的方式执行,取决于平台和初始化参数disk_asynch_io参数的值。使用异步I/O时,系统范围的等待的事件的统计可能不准确,会造成误导作用。

该事件一般不可能显示为主要的瓶颈,但它实际上也许是就是祸首。由于ORACLE统计等待时间的方式会造成统计的时间量不准确(如:从属查询产生的时间无法进行统计),所以对该事件不应该使用v$session_event视图中的total_wait或time_waited进行估计,应该使用v$sesstat视图中的直接读取操作次数(physical reads direct)进行判断:

selecta.NAME,

b.SID,

b.VALUE,

round((sysdate- c.LOGON_TIME) *24) hours_connected

fromv$statname a, v$sesstat b, v$session c

whereb.SID = c.SID

anda.STATISTIC# = b.STATISTIC#

andb.VALUE>0

anda.NAME='physical reads direct'

orderbyb.VALUE

由direct path read事件产生的原因,我们需要判断该事件正在读取什么段(如:散列段、排序段、一般性的数据文件),由此可判断产生该事件的原因是什么,可使用以下语句进行查询:

SELECTa.event,

a.sid,

c.sql_hash_value hash_vale,

decode(d.ktssosegt,

1,

'SORT',

2,

'HASH',

3,

'DATA',

4,

'INDEX',

5,

'LOB_DATA',

6,

'LOB_INDEX',

NULL)ASsegment_type,

b.tablespace_name,

b.file_name

FROMv$session_wait a, dba_data_files b, v$session c, x$ktsso d

WHEREc.saddr = d.ktssoses(+)

ANDc.serial# = d.ktssosno(+)

ANDd.inst_id(+) = userenv('instance')

ANDa.sid = c.sid

ANDa.p1 = b.file_id

ANDa.event ='direct path read'

UNIONALL

SELECTa.event,

a.sid,

d.sql_hash_value hash_value,

decode(e.ktssosegt,

1,

'SORT',

2,

'HASH',

3,

'DATA',

4,

'INDEX',

5,

'LOB_DATA',

6,

'LOB_INDEX',

NULL)ASsegment_type,

b.tablespace_name,

b.file_name

FROMv$session_wait a,

dba_temp_files b,

v$parameter c,

v$session d,

x$ktsso e

WHEREd.saddr = e.ktssoses(+)

ANDd.serial# = e.ktssosno(+)

ANDe.inst_id(+) = userenv('instance')

ANDa.sid = d.sid

ANDb.file_id = a.p1 - c.VALUE

ANDc.NAME='db_files'

ANDa.event ='direct path read'

注:如果是从临时文件中读取排序段的会话,则表明SORT_AREA_SIZE或PGA_AGGREGATE_TARGET的设置是不是偏小。如果是从临时文件中读取HASH段的会话,则表明HASH_AREA_SIZE或PAG_AGGREGATE_TARGET的设置是不是偏小。

当direct path read等待事件是由于并行查询造成的(读取的是一般的数据文件而非临时文件),父SQL语句的HASHVALUE与子SQL语句的HASHVALUE不同,可以通过以下SQL查询产生子SQL语句的父SQL语句:

SELECTdecode(a.qcserial#,NULL,'PARENT','CHILD') stmt_level,

a.sid,

a.serial#,

b.username,

b.osuser,

b.sql_hash_value,

b.sql_address,

a.degree,

a.req_degree

FROMv$px_session a, v$session b

WHEREa.sid = b.sid

ORDERBYa.qcsid, stmt_levelDESC

初始化参数db_file_direct_io_count用来设置直接读出和写入操作设置最大的IO缓冲区大小,因此能影响direct path read的性能,该参数在9i中被隐蔽,并改以字节数而不是块数为单位。

>> 使用10046第8层跟踪直接读取操作的ORACLE会话,其中P3参数表明块读取的数量。

>> 也可使用strace,truss追踪直接读取或直接写入操作的UNIX进程,从生成的TRACE文件可获得相应的直接IO大小。

>> 在第1层使用追踪事件10357,启动执行直接IO操作的会话的调试信息。

大量的direct path read等待事件最可能是一个应用程序的问题。

参数说明:

事件号:212

事件名:direct path read

参数一:读取数据文件的绝对文件号码file number

参数二:起始块号first dba

参数三:要读取的块数block cnt

由参数P1与P2推得访问的数据对象:

selects.segment_name, s.partition_name

fromdba_extents s

wherebetweens.block_idand(s.block_id + s.blocks -1)ands.file_id =

注:

>> 1. 如果是Temp文件,则表示该会话正在读取它先前用direct path write操作所创建的临时段,查明使用的是什么类型的临时段,有助于了解会话所做的事情。

SELECTDISTINCTdecode(t.ktssosegt,

1,'SORT',

2,'HASH',

3,'DATA',

4,'INDEX',

5,'LOB_DATA',

6,'LOB_INDEX',

'UNDEFINED')

FROMsys.x$ktsso t

WHEREt.inst_id = userenv('instance')AND

t.kssoses = AND

t.ktssosno =

>> 2. 如果是数据文件,则可能是并行查询从属操作在工作,通过P1值确定数据文件的名称:

selects.NAMEfromv$datafile swheres.FILE# =

unionall

selecta.name

fromv$tempfile a, v$parameter b

whereb.NAME= 'db_files'

anda.FILE# + b.VALUE=

等待时间:无超时

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值