这个等待事件在实际生产库中经常可以看到,这是一个用户操作引起的等待事件,当SESSION等待multi-block I/O完成时,会产生这个等待事件。
创新互联公司致力于互联网品牌建设与网络营销,包括网站建设、成都网站设计、SEO优化、网络推广、整站优化营销策划推广、电子商务、移动互联网营销等。创新互联公司为不同类型的客户提供良好的互联网应用定制及解决方案,创新互联公司核心团队十载专注互联网开发,积累了丰富的网站经验,为广大企业客户提供一站式企业网站建设服务,在网站建设行业内树立了良好口碑。
这通常发生在两种情况下:全表扫描(FTS: Full Table Scan)和索引快速扫描(IFFS: index fast full scan)。
Oracle每次读取一个连续块的DB_FILE_MULTIBLOCK_READ_COUNT,并将它们分散到缓冲区缓存中。如何做到这一点取决于平台和您正在运行的Oracle的发布。它也可能根据所读取的设备类型和请求的块的数量而变化。
这个等待事件有三个参数:
select event#,name,parameter1,parameter2,parameter3 from v$event_name where name = 'db file scattered read'; EVENT# NAME PARAMETER1 PARAMETER2 PARAMETER3 ---------- ----------------------------- -------------- --------------- --------------- 154 db file scattered read file# block# blocks
File#: 要读取的数据块所在数据文件的文件号。
Block#: 要读取的起始数据块号。
Blocks:需要读取的数据块数目。
会话信息
查看哪些会话正在执行扫描,并跟踪它们以查看扫描是否被期望是很有用的。
SELECT sid, total_waits, time_waited FROM v$session_event WHERE event='db file scattered read' AND total_waits>0 ORDER BY 3,2;也在V$SESSTAT中查询具有高“table scans blocks gotten”的会话
表空间 & 数据文件
可以查看AWR(或STATSPACK)报告的“Tablespace IO”和“File IO”部分,以及ADDM和ASH输出。这些文件应该显示哪些tablespaces / files正在为大多数I/O请求提供服务,并显示I/O子系统的速度。在“db file scattered read”中所涉及的 tablespaces/files 将有 "Av Blks/Rd" > 1。
读取文件的文件也可以通过查看V$FILESTAT中BLKS_READ / READS > 1找到(大于1的比率指示出现了多个块读取)。
segments & objects
查看哪些 segments/objects 对象执行读操作。
select event,p1,p2,p3,row_wait_obj# from gv$session where event = 'db file scattered read'; select object_name,object_type from dba_objects where object_id=row_wait_obj#;
SQL
可以查看AWR报告的“Top SQL by Disk Reads”部分,以获得任何导致高I/O的SQL的线索。如果启用了统计信息收集,那么V$SQL_PLAN还可以使用完整扫描提供有关SQL语句的线索。
V$SQL中高DISK_READS语句——在awr的“Top SQL by Disk Reads”部分中显示。
如果一个数据库的大表扫描过多,那么db file scattered read等待事件可能同样非常显著。如果table scans (long tables)的per Trans值大于0,你可能需要增加适当的索引来优化你的SQL语句
“db file scattered read”的一些具体点包括:
对SQL进行调优通常会获得最大的收益。
考虑分区以减少需要扫描的数据量。
受影响的对象是否被稀疏地填充?如果是这样,考虑缩减他们。
考虑高级压缩,以减少需要访问的块的数量。
小心使用多个缓冲池和缓存选项可能会有帮助。