DBWR 写数据的时机,算是 Oracle 里一个比较关键但容易被忽略的点。脏页太多、找不到空闲块这些情况,其实在你平时性能调优时都会遇到。文里用大白话讲了两个主要触发点,还提到和DB_BLOCK_WRITE_BATCH
、DB_BLOCK_MAX_SCAN_CNT
这些参数的关系,理解了它们怎么影响写操作,后续做缓存调优会轻松不少。
缓存写入性能老是上不去?就是DBWR
工作机制没搞清楚。像“脏列表到达最低限制”这种触发条件,听起来有点抽象,其实就是缓存里改动太多了,Oracle 觉得不能再拖,就主动去写盘了。另一个触发点是你找了半天空块没找到,也逼着它写。蛮实用的知识点,适合搞调优或诊断时查一查。
LRU 扫描这个机制也提了下,算是DBWR
写策略里的常客了。它会顺着 LRU 列表一个个扫,碰上能淘汰的就回收掉,不行就继续扫。DB_BLOCK_MAX_SCAN_CNT
就控制它最多扫多少个。如果你发现性能下滑,又发现这块一直在高频运行,是缓存不够用或者 SQL 访问模式比较激进。
对后台进程感兴趣的可以顺着看看这些文章,像Oracle 数据库后台进程或者内存结构那篇,讲得还挺系统的。想深入理解DBWR
写流程的,可以点这篇,把整个过程、策略和瓶颈点都拆开讲了。
建议你调试或者排查缓慢写盘时,别只盯着 IO,可以回头看看DBWR
是不是经常卡在某些写条件上。如果你经常做缓存相关调优,这篇文章蛮值得收藏的。