暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Oracle等待事件解析

dba悠然 2024-07-22
57



“采菊东篱下,

  悠然现南山”。

           晋·陶渊明

DBA悠然

专注数据库技术,开源信创、AI云计算.......

击关注,一路同行吧!

"作者: 悠然 | 首发公众号: dba悠然"

<温馨提示:以下内容仅代表个人观点>







    前几天参加了青学会举办的线上分享活动,围绕等待事件展开,接下来简单回顾一下。





1:等待事件分类

    根据OWI(Oracle Wait Interface)定义来看,Oracle等待事件主要分为以下几类:


1.IO Wait Event

2.Lock/Latch Event

3.Latency Wait Event

4.RAC Wait Event


主要涉及几个查询视图:


V$SESSION_WAIT 

V$SYSTEM_EVENT

V$EVENT_NAME

以上视图构成了OWI基本的查询基础。

2:IO如何产生的?

1.IO如何产生,且先看下面一张图:



PS:多年前画的,有点粗糙,不过还能用吧。


简单介绍一下Pysical IO如何产生(详细介绍参考视频录制):

1)Physical I/O产生:

当搜索内存Hash chains没有找到合适的buffer,则必须从disk磁盘读取该block到buffer;

2)CBC(cache buffer chain latch) latch获取;

3)CBC latch释放:

 Drop latch(cache buffer chain latch),将block读入buffer cache,对其他user透明操作;

4)当其他user也访问该block的并发场景,加载block到buffer过程:

  • 从REPL_AUX中获取一个free的Buffer Header;

  • 在该Buffer Header加上Block Address(rdba)标记;

  • 将组装的好的BH链接到正确的Cache Buffer Chain上;

  • 同时注入Pin(X),使得其他user可以读取,但是不能物理更改(DML);

  • 释放latch,同时将block加载load进Buffer Cache。



2.CacheBuffer Chain(Latch)结构:


3.Cache Buffer Pin与参数"_db_block_max_cr_dba"


    当需要对Buffer Block内容进行更改时,必须使用Cache Buffer Pin进行保护。如果这时对该Buffer Block进行查询,那么系统就会以当前Pin 住的Buffer Block为基础块,重构CR镜像。

    参数_db_block_max_cr_dba参数限定了单个Block Buffer的最大CR镜像数量,同时从限制了Chains的长度,提高了Chains扫描的速度,默认为6:


4.“Buffer Busy Wait”

     Cache Buffer Pin结构中包含了Pin相关的信息,当被阻塞的会话没有请求到Pin时,就可以将自己地址信息等提交到Wait list的末端进行等待,等待事件为“buffer busy wait”, 由参数_buffer_busy_wait_timeout决定,默认为1秒钟:



3:令部分人"谈虎色变的Direct IO"

   先前在某群有看到有个因为Direct IO导致故障的Case,貌似折腾了很久,当事人也似乎对于Direct IO有点“谈虎色变”了,借此机会分析一下:    

1.Direct IO产生:

   用户Session PGA中读/写数据,直接读取/写入到磁盘,而不经过SGA(Buffer Cache),从而减少了大批量数据读取/写入对BufferCache的性能冲击,提升IO性能。Direct IO可以通过设置DISK_ASYNC_IO是否同步或者异步模式,默认异步模式。


2.Direct IO主要场景:

   Direct IO主要由排序引起的,例如group by/union/distinct/rollup/LOB大对象,以及当排序数据超过PGA(work_area)时,在merge join或者load data 使用hint(append)等场景。


3.Direct IO如何优化:

  • 减少不必要排序

  • 创建合适的索引

  • 根据索引有序性调整组合索引列索引方式,减少索引排序大小

  • 设置较大的DB_FILE_DIRECT_IO_COUNT和DB_BLOCK_SIZE,提升IO吞吐性能 

  • 增加PGA_AGGREGATE_TARGET到合适值

  • 使用UNION ALL改写UNION

  • 使用HASH JOIN代替SORT MERGE 

  • 使用NESTED LOOPS代替HASH JOIN

  • 确保优化器使用正确的驱动表




4:结束语

   由于篇幅有限,Oracle等待事件就分享到这,后续会根据情况安排。


   PS小广告:关于分享的PPT资料,目前仅有等待事件相关部分;涉及内部原理的PPT材料,已准备了完整的学习专题(包括内存体系结构/Redo重做日志体系/事务回滚段/SQL优化/CBO优化等专题)(+视频),有兴趣的同学请添号或者知识星球:dba悠然同行成长圈 (见附录二维码)。


如果觉得本文有所帮助或者启发,欢迎添加好友交流收藏(篇幅有限,更多资讯请关注附录知识星球二维码),2024年我们一路同行!!!。


END


扫码关注,一路同行!
数据库|开源信创|架构重构|DevOPS|云计算|AI



精彩回顾




oracle直方图了解多少?

Oracle DBAer必备:如何打造自动化监控系统(一)
PG峰会的故事





文章转载自dba悠然,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论