【数媒在线课堂】其他信息(数媒专业课程) aspcms.cn

AWR报告中有很多不同的部分用来分析各种不同的问题。如果特定的问题并没有出现,那么分析

AWR报告的这些部分并不能有很大的帮助。

下面的信息可能会提到一些可能的问题,这些都是需要具体问题具体分析。

load profile

根据Top等待事件的不同,"Load Profile"可以提供一些有用的背景资料或潜在问题的细节信息。

在这个例子里,Top Events部分显示问题可能跟SQL的执行有关,那么我们接下来检查load profile部分。

如果检查AWR report是为了一般性的性能调优,那么可以看Redo size 和physical writes.

此外,hard parse的次数要少于soft parse.

如果mutex等待事件比较严重,如"library cache: mutex X",那么查看所有parse的比率会更有用。

把Load Profile部分跟正常时候的AWR报告做比较会更有用,比如,比较redo size, users calls, 和 parsing这些性能指标。

Instance Efficiency Percentages

Instance Efficiency部分更适用于一般性的调优,而不是解决某个具体问题(除非等待事件直接指向这些指标)。

从我们的这个例子来看,最有用的信息是%Non-Parse CPU,它表明几乎所有的CPU都消耗在了Execution而不是Parse上,所以调优SQL会对性能有改善。

99.82% 的soft parse比率显示hard parse的比例很小,这是可取的。

Execute to Parse %只有94%,说明cursor重用不是很好,也侧面说明了top event的"db file sequential read"过多,表明这些SQL语句使用了selectivity不高的索引从而导致访问了过多不必要的索引块或者使用了错误的索引。

我们总是期望这里的值都是接近100%,但是因为应用的不同,如果这个部分的参数的某些值很小,也是可以认为没有问题的;如在数据仓库环境,hard parse因为使用了物化视图或histogram而变得很高。所以,重要的是,需要把这部分信息和正常时候的AWR报告做比较来判断是否有问题。

Latch Activity

在这个例子里,并没有看到很高的latch相关的等待,所以这部分的信息可以忽略。

但是如果latch相关的等待很严重,我们需要查看Latch Sleep Breakdown 部分sleeps很高的latch。

这里top latch是cache buffers chains. Cache Buffers Chains latches是用来保护buffer caches中的buffers。在读取数据时,这个latch是正常需要获得的。Sleep的数字上升代表session在读取buffers时开始等待这个latch。争用通常来自于不良的SQL要读取相同的buffers。

在这个例子里,虽然读取buffer的操作发生了73亿次,但是只sleep了303,783次,可以认为是比较低的。AvgSlps/Miss(Sleeps/ Misses)也比较低。这表明当前Server有能力处理这样多的数据,所以没有发生Cache BuffersChains latch的争用。

这里可以提一下最高sleeps的latch – cache buffers chains

在Oracle数据库中,“cache buffers chains” 是一个用于管理缓冲区的机制。缓冲区是内存中的区域,用于存储数据块的副本,以便在需要时快速读取或写入数据。

定义

️Hash Chain 结构:Oracle 使用一个内部的哈希算法将所有的缓冲区分配到不同的哈希桶(Hash Bucket)中。每个哈希桶中包含一个哈希链表(Hash Chain List),也称为 “cache buffers chain”。这个链表通过缓冲区头(Buffer Header)将缓冲区连接起来。

️Buffer Header:缓冲区头包含数据块的概要信息,如文件号、块地址、状态等。

引发的等待事件 “latch: cache buffers chains”

️原因:当多个会话同时访问或修改同一个缓冲区时,Oracle 会使用 “cache buffers chains” 互斥体(Latch)来确保数据的一致性和完整性。如果多个进程同时尝试访问同一个哈希链表中的缓冲区,就会发生竞争,导致 “latch: cache buffers chains” 等待事件。

️常见场景

️高并发访问相同数据块:多个会话同时访问相同的数据块。

️热点块或热点链:某个缓冲区或哈希链表被频繁访问。

解决方法

️优化SQL语句:减少对热点数据块的访问频率。

️增加缓冲区大小:通过增加缓冲区的大小来减少对同一个缓冲区的竞争。

️调整哈希桶数量:通过调整哈希桶的数量来分散竞争。

这些措施可以帮助减少 “latch: cache buffers chains” 等待事件的发生,从而提高数据库的性能.