zhuqibs
作者zhuqibs·2020-04-26 09:37
软件开发工程师·Adidas

Oracle DBA 应知应会 -- 使用KEEP POOL能改善CBC争用吗

字数 1397阅读 732评论 0赞 6

使用KEEP POOL能否改善cache buffers chains闩锁争用?这个问题是多年前DBA界广有争论的一个话题。那时候大家对DB CACHE的内部结构的认识还处于比较初级的阶段,大家都认为KEEP POOL能够改善cache buffers chains的争用。
随着大家对DB CACHE内部结构的了解,对HASH CHAINS和LRU CHAINS的内部结构的认识,有一些DBA提出了一个论断,就是启用KEEP POOL仅仅改变了LRU CHAINS的结构,对于HASH CHAINS并无影响。KEEP POOL启用后,在LRU CHAINS结构中,多了一个KEEP POOL LRU CHAINS的链,所有的KEEP POOL的CACHE都属于一个DB CACHE中的子池,这个池中的BUFFER HEAD都链在不同的链上,其AGE OUT算法也和DEFAULT POOL不同。不过无论LRU CHAINS如何变化,都不影响到HASH CHAINS的结构。某张表,比如T_SMALL这张表,放在DEFAULT POOL还是KEEP POOL,其RDBA不会变化,其RDBA的HASH值也就不会变化,因此HASH CHAINS不会发生变化。根据这个特点,可以得出一个结论,启用KEEP POOL无法改善HASH CHAINS的性能。
这个观点似乎无懈可击,目前这也是被DBA界所广为接受的观点。不过老白认为这个观点仅仅是局部的真理。从KEEP POOL的启用对HASH CHAINS的影响上看,KEEP POOL并不能改善cache buffers chains争用。但是从另外一个角度来看,由于KEEP POOL的启用,一些访问十分频繁的数据可以放入KEEP POOL中,如果KEEP POOL足够大,那么KEEP POOL的命中率可以接近100%,因此启用KEEP POOL,可以改善DB CACHE的命中率,减少物理读。从这个角度上来看,KEEP POOL的启用会减少SERVER进程对cache buffers chains的pin操作,从而就能够减少cache buffers chains的争用。
从上面的推论来看,启用KEEP POOL虽然不能直接改善cache buffers chains争用,不过由于KEEP POOL可以改善DB CACHE的命中率,减少物理读,从而又能够间接性的改善cache buffers chains争用。从这个例子我们也可以看到,Oracle数据库是一个十分复杂的综合体系,就像我们地球人生活的生态环境一样,不是简单可以用公式来描述的,一个变更可能会引起连锁反映。因此仅仅从问题的表层去分析是不能客观反映出问题的本质的。分析这个问题,不能仅仅从HASH CHAINS的结构和cache buffers chains闩锁本身来考虑,而应该综合考虑DB CACHE的总体情况,才能得到比较客观的答案。
事实上,启用KEEP POOL能否改善cache buffers chains争用,这个问题还真的不好一概而论,如果cache buffers chains争用集中在某条HOT CHAINS上,而KEEP POOL中存储的对象和这些HOT CHAINS没有任何关系,那么启用KEEP POOL能够达到的优化效果也会十分有限。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

6

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广