db file sequential read
db file sequential read等待事件有3个参数:file#,first block#,和block数量。在10g中,这等待事件受到用户I/O等待级别的影响。当处理db file sequential read等待事件的时候,牢记以下关键想法。
lOracle进程需要一个当前不在SGA中的块,等待数据库块从磁盘读入到SGA中
l要看的两个重要的数字是单独会话的TIME_WAITED和AVERAGE_WAIT。
l重要db file sequential read等待时间最可能是一个应用问题。
db file sequential read等待时间是由于执行对索引,回滚(undo)段,和表(当借助rowid来访问),控制文件和数据文件头的单块读操作SQL语句(用户和递归)引起的。
对于这些对象的物理I/O请求是很正常的,因此db file sequential read等待的存在不是一定意味库或应用出错了。如果会话在这事件上花了好长事件,它可能也不是一个糟糕的事情。相反,如果会话花了大量时间在equeue或latch free上,那么一定是有问题。这儿单块读变的复杂了。
==========
目的:从得到各个session中db file sequential read等待事件的总的等待时间,和等待时间所占总的等待时间(各种等待事件的总和时间)的比例中分析哪一个sid更高,更重要。
==========
select a.sid,
a.event,
a.time_waited,
a.time_waited / c.sum_time_waited * 100 pct_wait_time,
round((sysdate - b.logon_time) * 24) hours_connected
fromv$session_event a, v$session b,
(select sid, sum(time_waited) sum_time_waited
fromv$session_event
whereevent not in (
'Null event',
'client message',
'KXFX: Execution Message Dequeue - Slave',
'PX Deq: Execution Msg',
'KXFQ: kxfqdeq - normal deqeue',
'PX Deq: Table Q Normal',
'Wait for credit - send blocked',
'PX Deq Credit: send blkd',
'Wait for credit - need buffer to send',
'PX Deq Credit: need buffer',
'Wait for credit - free buffer',
'PX Deq Credit: free buffer',
'parallel query dequeue wait',
'PX Deque wait',
'Parallel Query Idle Wait - Slaves',
'PX Idle Wait',
'slave wait',
'dispatcher timer',
'virtual circuit status',
'pipe get',
'rdbms ipc message',
'rdbms ipc reply',
'pmon timer',
'smon timer',
'PL/SQL lock timer',
'SQL*Net message from client',
'WMON goes to sleep')
having sum(time_waited) > 0 group by sid) c
wherea.sid= b.sid
anda.sid= c.sid
anda.time_waited > 0
anda.event= 'db file sequential read'
order by hours_connected desc, pct_wait_time;
SID EVENTTIME_WAITED PCT_WAIT_TIME HOURS_CONNECTED
---- ----------------------- ----------- ------------- ---------------
186 db file sequential read6444677.0267848105
284 db file sequential read145840590.992838105
194 db file sequential read145870891.0204316105
322 db file sequential read146255791.1577045105
139 db file sequential read21132552.628105511
256 db file sequential read24723658.046975511
192 db file sequential read24311388.01936252
你能做两件事来最小化db file sequential read事件:
l通过降低physical和logical read来优化导致大多数wait的SQL语句
l降低平均等待时间
此外,当前正运行的SQL语句可能或不可能是导致wait的。这就是没有历史数据的交互式诊断经常是无功而返的原因。你能查询v$sql视图来查找有高平均DISK_READS的语句,但然后你怎样才能判断他们属于会话?因为这些限制,你可能必须确定和下次明确跟踪会话的SQL语句。一旦你已经找到,优化目标就将降低物理和逻辑读的数量。
注意:除了DISK_READS字段外,oracle10g中的V$SQL和V$SQLAREA视图有不错的新字段:USER_IO_WAIT_TIME,DIRECT_WRITES,APPLICATION_WAIT_TIME,CONCURRENCY_WAIT_TIME,CLUSTER_WAIT_TIME,PLSQL_EXEC_TIME和JAVA_EXEC_TIME。你能找到有最高的累计或平均的USER_IO_WAIT_TIME的sql语句。
=======
目的:根据db file sequential read中的P1,P2两个参数得到对象名和分区名(该等待事件单块读等待的对象名和分区名),使用v$bh的缺点你必须等待块被读入到buffer cache中;否则X$BH视图在buffer中没有P1,P2参数所指的信息。DBA_OBJECTS视图也不包含P1和P2所指的rollback或undo段对象:
======
select b.sid,
nvl(substr(a.object_name,1,30),
'P1='||b.p1||' P2='||b.p2||' P3='||b.p3) object_name,
a.subobject_name,
a.object_type
fromdba_objects a, v$session_wait b, x$bh c
wherec.obj = a.object_id(+)
andb.p1 = c.file#(+)
andb.p2 = c.dbablk(+)
andb.event = 'db file sequential read'
union
select b.sid,
nvl(substr(a.object_name,1,30),
'P1='||b.p1||' P2='||b.p2||' P3='||b.p3) object_name,
a.subobject_name,
a.object_type
fromdba_objects a, v$session_wait b, x$bh c
wherec.obj = a.data_object_id(+)
andb.p1 = c.file#(+)
andb.p2 = c.dbablk(+)
andb.event = 'db file sequential read'
orderby 1;
SID OBJECT_NAMESUBOBJECT_NAMEOBJECT_TYPE
----- ------------------------- ------------------------- -----------------
12 DVC_TRX_REPOSDVC_TRX_REPOS_PR64TABLE PARTITION
128 DVC_TRX_REPOSDVC_TRX_REPOS_PR61TABLE PARTITION
154 ERROR_QUEUEERROR_QUEUE_PR1TABLE PARTITION
192 DVC_TRX_REPOS_1IXDVC_TRX_REPOS_20040416INDEX PARTITION
194 P1=22 P2=30801 P3=1
322 P1=274 P2=142805 P3=1
336 HOLD_Q1_LIST_PKINDEX
针对索引的sequential reads解决方案:
1.SQL调优,得到sql语句
select a.sid,a.seq#,a.event,a.p1text,
a.p1,a.p1raw,a.p2text,a.p2,
a.p2raw,a.p3text,a.p3,a.p3raw,
a.wait_time,a.seconds_in_wait, a.state,b.serial#,
b.username,b.osuser,b.paddr,b.logon_time,
b.process,b.sql_hash_value,b.saddr,b.module,
b.row_wait_obj#, b.row_wait_file#, b.row_wait_block#,
b.row_wait_row#
fromv$session_wait a, v$session b
wherea.sid= b.sid
andb.username is not null
andb.type<> 'BACKGROUND'
anda.event in (
'db file sequential read',
'db file scattered read',
'latch free',
'direct path read',
'direct path write',
'enqueue',
'library cache pin',
'library cache load lock',
'buffer busy waits',
'free buffer waits');
select hash_value,address,piece,sql_text
from v$sqltext
wherehash_value = <cursor hash value>
order by piece;
2.如果执行计划是table access by index rowid,检查索引的clustering factor也是值得做的。
select id.index_name,tb.table_name,id.clustering_factor,tb.num_rows,tb.blocks
from dba_indexes id,dba_tables tb
where id.table_name=tb.table_name
and tb.table_name='&1' and tb.owner='&2';
如果DBA_INDEXES.CLUSTERING_FACTOR接近表中块的数量,那么表中大多数行是排序的。这是期望的。然而,如果clustering factor接近表中行的数量,它意味着表中行是随机排列。这种情况,对于在同样叶块中的索引块来说,指向同样数据块中行是不可能的,因此它要求更多I/Os来完成这操作。你可以采取rebuilding表来改善索引clustering fator,为了行根据索引键来被排序,其后重建索引。如果表不只有一个索引,什么会发生?好,它会下降。你仅能迎合最多使用的索引
3.也检查来看是否应用有最近已经引入一个新的索引,通过以下查询。新索引的引入可能导致优化器为访问表的SQL语句选择一个不同的执行计划。新计划可能产生一个比旧计划更好的,中性的,或糟糕的性能。
select owner,
substr(object_name,1,30) object_name,
object_type,
created
fromdba_objects
whereobject_type in ('INDEX','INDEX PARTITION')
order by created;
OPTIMIZER_INDEX_COST_ADJ和OPTIMIZER_INDEX_CACHING初始化参数能影响优化器去采用nested loops操作和在全表扫描上选择一个索引访问路径。OPTIMIZER_INDEX_COST_ADJ参数默认是100。较低的值哄骗优化器认为索引访问路径更便宜。OPTIMIZER_INDEX_CACHING参数默认值是0。较高的值通知优化器一个更高的百分比索引块已经在buffer cache中,nested loops操作更便宜。一些第三方的应用使用这方法来改善索引使用。这些参数的不合适的使用能导致重大的I/O等待时间。查明会话正以什么值运行。直到9i数据库,这信息仅能通过跟踪以trace event 10053的级别1的会话,并检查trace文件。在oracle10g中,这可以查询v$ses_optimizer_env视图。
确保所有对象的统计数据是当前数据的典型,因为不准确的统计数据的确会导致优化器生成糟糕的不该用索引读却调用索引读的执行计划。记住,统计数据需要是有代表性的,而不必最新的,并且执行计划可能在统计数据被收集的每一次而改变。
注意:当使用一个低estimate比例值分析表或索引的时候,oracle正常情况使用单个块读,这将增加该会话的db file sequential read统计数据(v$session_event)和实例(v$system_event)。
针对表(table access by index rowid)的sequential reads
你可以看db file sequential read等待事件,通过P1,P2参数得到是表而不是索引。对于SQL语句来说通过从索引获得的rowid访问表是正常的,如下面解释计划显示,当通过rowid来读一个表的时候,oracle使用一个单独块I/O:
LVL OPERATIONOBJECT
--- --------------------------------- ---------------------
1 SELECT STATEMENT
2TABLE ACCESS BY INDEX ROWIDRESOURCE_ASGN_SNP
3INDEX RANGE SCANRESOURCE_ASGN_SNP_4IX
分享到:
相关推荐
db file sequential read(ms) log file parallel write(ms) log file sync(ms) db file scattered read(ms) #IO WorkLoad Oracle IOPS Oracle MBPS db file sequential read db file scattered read log file ...
常见的非空闲等待事件包括 db file scattered read、db file sequential read、buffer busy waits、free buffer waits、enqueue、latch free、log file parallel write、log file sync 等。 1. db file scattered ...
"Oracle等待事件说明一"主要关注了几个关键的等待事件,包括"buffer busy waits"、"db file parallel write"、"db file single write"、"db file scattered read"、"db file sequential read"以及"direct path write...
一些常见的非空闲等待事件有 db file scattered read、db file sequential read、buffer busy waits、free buffer waits、enqueue、latch free、log file parallel write、log file sync 等。 db file scattered ...
5. **等待事件**(Timed Events):db file scattered read、latch free、db file sequential read等是等待时间最多的事件。db file scattered read和db file sequential read涉及到I/O操作,可能需要优化表空间的I/...
db file sequential read 与 db file scattered read 等待的差别是什么?如果以上等待比较多,证明了什么问题?答案是:db file sequential read 是 DB 文件顺序读取,通常显示与单个数据块相关的读取操作(如索引...
当“db file sequential read”和“db file scattered read”等读操作进入等待事件的前五名时,通常表示存在缓冲区忙等待问题。例如,以下STATSPACK报告片段显示了这些等待事件: ``` % 总和事件 等待 时间(s) 消逝...
非空闲等待事件,如buffer busy waits、db file scattered read、db file sequential read等,通常揭示了系统中的竞争和资源冲突,需要通过深入分析来解决。 针对I/O统计的诊断,可以使用SQL查询来获取表空间、...
通过识别消耗时间最多的事件,如`db file sequential read`和`db file scattered read`,可以定位性能瓶颈并采取相应措施进行优化。 综上所述,Oracle数据库性能优化涉及到多个层面,包括存储硬件、操作系统配置、...
- **Db file sequential read / scattered read**:这些等待事件通常涉及顺序读取和散列读取操作。优化索引使用,减少全表扫描,或者提升硬件性能(如磁盘I/O速度)有助于缓解。 - **Direct path read**:这是...
12. 用户 I/O 类:由用户 I/O 操作引起,如 db file sequential read。 对于特定的等待事件,例如 db file scattered read,它通常与全表扫描相关。在进行全表扫描时,数据会分散读入 buffer cache。高频率的 db ...
#### 八、DB File Sequential Read与DB File Scattered Read的区别 **知识点:** - **DB File Sequential Read:** - 表示对单个数据块的顺序读取操作。 - 如索引读取。 - 过多的此类等待可能意味着连接顺序不...
数据库性能分析显示,主要的性能瓶颈在于用户I/O,尤其是db file sequential read和db file scattered read事件,以及enq: TX - row lock contention,这些都可能导致新Session无法启动或需要更多内存来处理更多的...
- **db file sequential read**: 395,171 - **buffer busy waits**: 272,977 - **log file sync**: 27,338 以上是针对“STATSPACK report”报告的关键知识点的详细解析,涵盖了数据库的基本信息、性能数据以及...
- **db file sequential read**:表示顺序读取数据文件中的数据块时发生的等待事件。 - **db file parallel read**:在并行查询中,当多个进程同时读取数据文件时产生的等待事件。 - **db file write**:表示将数据...
#### 八、DB File Sequential Read与DB File Scattered Read等待的区别 - **DB File Sequential Read**: 指的是顺序读取数据库文件中的数据块,通常与索引访问有关。如果这类等待较多,可能意味着查询执行顺序不当...
首先,对于I/O性能瓶颈,他们可能采用了更高效的存储解决方案或优化了数据库的读写策略,以减少“db file sequential read”事件的发生。对于网络通信瓶颈,可能涉及到优化SQL语句以减少网络数据传输量,或者调整...
- **解释**:`db file sequential read` 等待事件中的 P1 参数表示正在访问的文件号,即数据库文件的唯一标识符。 ### 15. 显示数据库日志使用情况 - **命令**:使用 `onstat -d` 命令可以查看数据库日志的使用情况...