14人参与 • 2025-10-23 • Oracle
好的,我们来详细剖析一下 oracle 数据库中的 db file parallel read 等待事件。
核心概念:
db file parallel read 是一个 i/o 类 等待事件。它表示一个会话(通常是前台用户进程或服务进程)正在等待一次由数据库自身发起的、并行化的、读取多个非连续数据块(通常来自不同数据文件)的物理 i/o 操作完成。
关键点理解:
db file scattered read 那样读取连续范围的多块)。它们可能散落在同一个数据文件的不同区域,或者更常见的是分布在多个不同的数据文件中。server process)直接发起的,而不是由后台进程(如 dbwn)发起的。db file parallel read),直到所有请求的数据块都被读取到 buffer cache 中(或直到超时)。db file parallel read 描述的是单个进程内部如何执行一次物理 i/o 操作(并行提交多个离散 i/o 请求)。而并行查询是多个进程(并行执行服务器)协作处理一个 sql 语句。当然,并行查询的进程在执行物理读时,它们自己也可能遇到 db file parallel read 等待。详细原理与产生过程:
file header block)。segment header block),特别是 assm 位图块。preadv() 或 aio 接口)将这个列表提交给操作系统。db file parallel read 等待事件。p1 = 要读取的文件数量,p2 = 要读取的总块数,p3 = 这些请求被拆分的次数(通常与 p2 相关)。db file parallel read 等待中恢复,获取到所需的数据块,继续执行 sql 语句(进行逻辑处理、返回结果等)。典型场景:
db file scattered read 更常与 fts 关联(读取连续范围的多块),但当表数据非常分散(高水位线下有很多碎片化的空闲空间,或者表经过大量 dml 后没有重组),或者 buffer cache 只能容纳部分数据块时,oracle 在预取 (prefetching) 后续非连续块时,就可能采用 parallel read 的方式。特别是当优化器认为离散读取更高效时。db file parallel read。control file 等待事件更典型,但有时也可能归入 db file parallel read)。index join, and-equal),服务进程需要同时从这些不同的索引段中读取离散的数据块(叶子块或分支块)。gc 事件,但当实例需要从磁盘读取块(例如首次访问或强制全库扫描)且该块在本地实例的 buffer cache 中没有时,读取磁盘的过程本身就可能触发 db file parallel read。可能的原因(导致该等待成为瓶颈):
cfq, deadline, noop)配置不当。max_sectors_kb, nr_requests, queue_depth) 设置过低,限制了并行处理能力。aio) 未启用或配置不当(oracle 推荐使用 aio 来优化并行读)。parallel read) 时,它可能会尝试提交非常大的离散 i/o 请求列表,超过存储的最佳处理能力,反而导致延迟增加。需要根据存储特性(如 ssd 条带大小、raid 配置)进行合理设置。setall 或 asynch,限制了 oracle 使用异步和直接 i/o 的能力。db file parallel read 请求。parallel read)。db file parallel write,但检查点期间也需要读取文件头等信息,可能涉及 parallel read。详细排查过程:
排查的核心思路是:定位引发大量 db file parallel read 的 sql 和对象,分析 i/o 性能,确定是 sql/设计问题还是存储/配置问题。
确认问题存在:
top 5 timed foreground events 或 top wait events 部分,确认 db file parallel read 是否在 top 事件中,并且其 total wait time (s) 和 avg wait (ms) 是否显著高于正常水平。注意 % db time。v$session_wait (当前等待) 或 v$active_session_history (近历史) / dba_hist_active_sess_history (历史 ash) 查看当前或历史会话是否正在经历或经历过长时间的 db file parallel read 等待。-- 当前等待的会话 select sid, serial#, event, p1, p2, p3, seconds_in_wait, state from v$session where event = 'db file parallel read'; -- 最近15分钟内经历该等待的会话 (ash) select sample_time, session_id, session_serial#, sql_id, event, wait_time_micro, current_obj# from v$active_session_history where event = 'db file parallel read' and sample_time > sysdate - 15/1440; -- 15分钟
定位引发等待的 sql:
sql statistics -> sqls with top db time / sqls with top event waits。查找在 db file parallel read 上消耗时间最多的 sql_id。sql statistics -> sql ordered by elapsed time / sql ordered by user i/o wait time。结合 elapsed time 和 user i/o wait time 高的 sql。sid 和 serial# 或 sql_id:-- 当前 sql select sql_id, sql_child_number, sql_exec_id, prev_sql_id from v$session where sid = &sid and serial# = &serial#; -- 获取 sql 文本 select sql_fulltext from v$sql where sql_id = '&sql_id';
分析 sql 执行计划:
dbms_xplan (select * from table(dbms_xplan.display_cursor('&sql_id', &child_number));) 或 awr 报告中的执行计划。a-rows (actual rows - 如果收集了执行统计) 是否偏差巨大?偏差大可能导致选择了低效的计划。定位引发等待的数据库对象:
current_obj# 或 p1/p2 值(结合 v$session_wait 的 p1=files count, p2=blocks count,但通常不如 ash 直接)。select owner, object_name, object_type, subobject_name from dba_objects where object_id = ¤t_obj#; -- 来自 ash
检查 i/o 性能:
iostat by function/filetype / iostat by file / tablespace io stats。查看:
av rd (ms) / avg wait time (ms): 单块读取平均等待时间(db file sequential read)和 db file parallel read 的平均等待时间。理想情况下(特别是 ssd),应该 < 10ms,最好 < 5ms。机械盘可能 10-20ms 算正常,超过 20ms 通常表示 i/o 慢。read total (mb) / reads: 总的物理读量和 i/o 次数。read iops: 每秒物理读次数。% of total read i/o: 哪些文件/表空间是热点。-- 文件级 i/o 统计 (自实例启动)
select file_id, file_name,
phyrds "physical reads",
phyblkrd "physical blocks read",
readtim "read time (cs)", -- 厘秒
round(readtim / decode(phyrds, 0, 1, phyrds), 3) "avg read time (ms)"
from v$filestat fs
join dba_data_files df on fs.file# = df.file_id
order by readtim desc;
-- 系统级 i/o 统计
select stat_name, value
from v$sysstat
where stat_name like '%physical read%'
or stat_name like '%read io requests%';
iostat -dxm 5 (看 await, svctm, %util, r/s, rkb/s), vmstat 1, dstat, sar -diostat -drl 1, vmstat 1, filemoniostat -xnz 5, vmstat 1, dtracesvctm, service time): 磁盘处理一个 i/o 请求的时间。ssd 应 < 1ms,机械盘 < 20ms。await): i/o 请求在 os 队列中等待时间 + 服务时间。高 await 通常表示磁盘饱和或慢。await 应接近 svctm,远高于 svctm 说明队列长。%util): 磁盘繁忙程度百分比。持续 > 70-80% 通常表示饱和。ssd 可以处理接近 100%,但延迟可能升高。r/s): 每秒读操作数。与存储规格对比。rkb/s): 每秒读数据量 (kb/s)。与存储带宽对比。avgqu-sz): 平均队列长度。持续 > 2-3 可能表示饱和。检查数据库配置:
-- 重要 i/o 相关参数
show parameter db_file_multiblock_read_count
show parameter filesystemio_options
show parameter disk_asynch_io -- (通常 true, 表示尝试使用 aio)
-- 检查数据文件分布 (是否都放在同一慢速盘上?)
select tablespace_name, file_name from dba_data_files;
-- 检查表/索引碎片 (可能需要定期分析)
exec dbms_stats.gather_table_stats('owner', 'table_name');
-- 检查 assm 段位图块访问 (v$segstat 或 awr 的段统计)
区分问题根源:
avg wait (ms) 很高 (e.g., > 20ms) 且 os/存储监控也显示高延迟: 问题很可能是存储 i/o 性能不足或配置不当(os i/o 参数、db_file_multiblock_read_count 过大)。需要优化存储或调整配置。avg wait (ms) 在可接受范围 (e.g., < 10ms),但等待事件的 total wait time (s) 很高: 问题根源是应用产生了过多的物理 i/o 请求(低效 sql、缺乏索引、全扫大表)。需要优化 sql 和数据库设计。db file parallel read 的等待次数 (waits) 和等待时间 (total wait time) 很高,但 avg wait (ms) 很低: 表明虽然每次并行读很快,但数据库不得不发起极其大量的并行读操作。这通常指向极其低效的 sql 或严重碎片化的对象,导致 oracle 需要读取海量离散块。优化建议:
alter table ... move, alter index ... rebuild),特别是频繁 dml 的表。考虑使用 shrink space。striping)配置得当,lun 分布均匀,避免热点。filesystemio_options=setall 或 asynch)。deadline 或 noop for ssd)和队列深度参数 (queue_depth, nr_requests)。partition alignment)。db_file_multiblock_read_count: 不要盲目设大。参考存储的最佳 i/o 大小(如 ssd 的条带大小/raid 条带大小)进行设置。通常 128 是一个较高的上限,很多场景下 32 或 64 可能更优。测试是关键。alter system set db_file_multiblock_read_count=64 scope=spfile/both;db_cache_size): 减少物理 i/o 需求(但治标不治本,仍需优化 sql)。db_writer_processes。fast_start_mttr_target 或相关隐含参数(需谨慎),避免过于频繁或过长的检查点。总结:
db file parallel read 是 oracle 优化离散块读取性能的一种机制。它本身不是错误,而是数据库工作的体现。当它成为系统的主要瓶颈等待事件时,表示系统在执行大量离散物理读操作,并且/或者这些操作的延迟较高。
排查的核心是:
根据分析结果,采取针对性的优化措施,优先优化 sql 和数据库设计,其次是存储和配置调整。
到此这篇关于oracle数据库面试宝典之db file parallel read等待事件处理过程的文章就介绍到这了,更多相关oracle db file parallel read等待事件处理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论