Oracle中如何解决LATCH:CACHE BUFFERS LRU CHAIN

简单来讲,Oracle为了高效管理BUFFER CACHE主要使用以下2种LRU列:
LRU列,又叫替换列(replacement list),其中又分为主列和辅助列。
主列:已使用的缓冲区列,分为HOT和COLD区域。HOT区域中存放着使用频率高的数据块,COLD区域存放使用频率较低的数据块。Oracle用TCH表示该区域内数据块的使用频繁程度。
辅助列:空闲缓冲区列。数据库重启之后,所有的缓冲区头开始时都是在辅助列中管理的。或者在LRU-W上的脏数据写进制数据文件之后,Oracle会将相关的缓冲区头直接挂载至辅助列上。辅助列上的缓冲区头表示可以直接被其他数据块使用。
LRU-W列,又叫写入列(LRU-Write list),脏数据列。脏缓冲区头由DBWR进程从LRU列移动至LRU-W列中(有时DBWR进程因为太忙而不能执行这种移动)。寻找空闲缓冲区的服务器进程在LRU列表上扫描时,如果遇到了脏缓冲区头,就将脏缓冲头从LRU列表中移动至LRU-W列表中。LRU-W列中又分为主列和辅助列。
主列:已修改的缓冲区列。
辅助列:当前正通过DBWR进程写入的缓冲区列。
提示 除了LRU列和LRUW列,还有LRU-XO列、LRU-XR列、LRU-P列。在性能优化时,最容易引起性能问题的是LRU列和LRU-W列,所以一般情况下并不需要关心LRU-XO列、LRU-XR列、LRU-P列,所以本章也不打算深入讲解这3列。
LRU列和LRW-W列总是成对(pair)的出现,称之为WORKING SET。为了提高性能,Oracle使用多个WORKING SET,由CACHE BUFFERS LRU CHAIN LATCH保护。基于性能上的考虑,服务器进程在检索空闲缓冲区时,首先会检索LRU列的辅助列,当辅助列没有剩余缓冲区时,才会检索LRU主列中的COLD区域。
另外需要指出的是LRU列中HOT和COLD区域只是针对nK BUFFER POOL的,KEEP POOL和RECYCLE POOL中没有HOT和COLD区域之分。KEEP POOL比较适合存放使用频繁读取的小表,RECYCLE POOL比较适合存放使用频率较低的大表。数据块在nK BUFFER POOL中的存放位置受以下隐含参数的影响:
隐含参数_db_percent_hot_default,默认值为50。表示SINGLE BLOCK I/O(如唯一键索引读)读取的数据块进入BUFFER CACHE之后,会将其放置在nK BUFFER POOL中LRU列的中间,即“热”端的尾部。MULTI BLOCK I/O(如对大表进行全表扫描)时,服务器进程会将大量的数据块读至BUFFER CACHE中,为了减轻对LRU列表中数据块(热块)的冲击,Oracle会将大表全表扫描的数据块存放至LRU列表的尾部,存放在LRU列表尾部的数据块可以尽快地被交换出BUFFER CACHE。
隐含参数_db_percent_hot_keep和_db_percent_hot_recycle,默认值为0。表示数据块进入到KEEP POOL和RECYCLE POOL时放在LRU列的尾端。
前面提到,Oracle为了提高性能会使用多个WORKING SET,并由CACHE BUFFERS LRU CHAIN LATCH保护。每一个CACHE BUFFERS LRU CHAIN LATCH对应一个WORKING SET,接下来将相对深入地探讨一下CACHE BUFFERS LRU CHAIN LATCH。
可以通过以下方法获取当前系统中CACHE BUFFERS LRU CHAIN LATCH的数量:
查询隐含参数_db_block_lru_latches。
通过查询V$LATCH_CHILDREN获得。如下所示:

SQL> select count(*) from v$latch_children2  where name='cache buffers lru chain';

Oracle默认创建的CACHE BUFFERS LRU CHAIN LATCH的数量跟CPU的个数和DB_WRITER_PROCESSES参数有关。若DBWR数小于4,则创建4CPU_COUNT个CACHE BUFFERS LRU CHAIN LATCH,若DBWR数大于4,则创建DB_WRITER_PROCESSESCPU_COUNT个CACHE BUFFERS LRU CHAIN LATCH。从以上算法可以看出,CACHE BUFFERS LRU CHAIN LATCH的数量总是大于DBWR数量,即WORKING SET的数量总是大于DBWR的数量。不同的WORKING SET可以出现在不同类型的BUFFER POOL中,每个BUFFER POOL独立使用自己的CACHE BUFFERS LRU CHAIN LATCH
由于一个数据库实例可以配置8种不同类型的BUFFER POOL(DEFAULT、2KB、4KB、8KB、16KB、32KB、KEEP、RECYCLE BUFFER POOL),因此CACHE BUFFERS LRU CHAIN LATCH的数量至少为8个。可以通过以下查询获得各个BUFFER POOL中CACHE BUFFERS LAU CHAIN LATCH的使用情况:
SQL> select d.blk_size,c.child#,p.bp_name,c.gets,c.sleeps
2 from x k c b w d s d , v kcbwds d, v kcbwdsd,vlatch_children c, x$kcbwbpd p
3 where d.set_latch=c.addr
4 and d.set_id between p.bp_lo_sid and p.bp_hi_sid
5 order by c.child#;

BLK_SIZE CHILD# BP_NAME GETS SLEEPS


  8192          1 KEEP                        459          08192          2 KEEP                        459          08192          3 RECYCLE                     459          08192          4 RECYCLE                     459          08192          5 DEFAULT                  410618          28192          6 DEFAULT                  402282          02048          7 DEFAULT                     459          02048          8 DEFAULT                     459          04096          9 DEFAULT                     459          04096         10 DEFAULT                     459          08192         11 DEFAULT                     459          08192         12 DEFAULT                     459          016384         13 DEFAULT                     459          016384         14 DEFAULT                     459          032768         15 DEFAULT                     459          032768         16 DEFAULT                     459          0

16 rows selected.
从上面的查询结果可以看出,目前系统存在16个CACHE BUFFERS LRU CHAIN LATCH,但只使用了2个。以下2种情况下必须要获得CACHE BUFFERS LRU CHAIN LATCH:
数据块读进BUFFER CACHE之前需要获得CACHE BUFFERS LRU CHAIN LATCH查找空闲缓冲区。
DBWR进程为了获得脏数据块列表,扫描LRU-W列之前需要获得CACHE BUFFERS LRU CHAIN LATCH。此外将空闲缓冲区移动至LRU辅助列,也需要获得CACHE BUFFERS LRU CHAIN LATCH。
当许多进程同时检索LRU列或者LRU-W列时,则容易出现LATCH: CACHE BUFFERS LRU CHAIN等待事件。一般来讲,CACHE BUFFERS LRU CHAIN LATCH争用最主要的原因是低效的SQL导致前台进程过多地请求空闲缓冲区引起的。与发生LATCH:CACHE BUFFERS CHAINS等待事件类似,不能简单地通过调整隐含参数_db_block_lru_latches来解决LATCH: CACHE BUFFERS LRU CHAIN等待事件。
在这里,读者需要仔细体会CACHE BUFFERS CHAINS LATCH和CACHE BUFFERS LRU CHAIN LATCH之间的区别:
多个会话并发访问相同的表或者索引时,则发生CACHE BUFFERS CHAINS LATCH争用的概率较高,因为相同表或索引的数据块多集中于几条相同的HASH CHAIN中。
多个会话并发访问不同的表或者索引时,则发生CACHE BUFFERS LRU CHAIN LATCH争用的概率较高,因为不同的数据块都存放在BUFFER CACHE中的概率较低,当发生物理读时需要更多地扫描LRU列和LRU-W列。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/81750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++:迭代器

迭代器的本质&#xff1a;对象。 迭代器与指针类似&#xff0c;通过迭代器可以指向容器中的某个元素&#xff0c;还可以对元素进行操作。 迭代器统一规范了遍历方式。不同的数据结构可以用统一的方式去遍历。 接下来是一个自定义迭代器的代码示例。 #include<iostream&g…

(4)Java虚拟线程与传统线程对比

虚拟线程与传统线程对比 &#x1f504; &#x1f4cb; 核心问题 Project Loom的虚拟线程与传统线程在资源消耗上有何区别&#xff1f;如何设计一个支持百万级并发的服务&#xff1f; &#x1f4ca; 资源消耗比较 &#x1f418; 传统线程 &#x1f4cf; 每线程约1MB栈空间&am…

Java 单元测试框架比较:JUnit、TestNG 哪个更适合你?

Java 单元测试框架比较&#xff1a;JUnit、TestNG 哪个更适合你&#xff1f; 在 Java 开发领域&#xff0c;单元测试是保证代码质量的重要环节。而选择一个合适的单元测试框架&#xff0c;对于提升测试效率和代码可靠性至关重要。本文将深入比较 JUnit 和 TestNG 这两个主流的…

从零开始的抽奖系统创作(2)

我们接着进行抽奖系统的完善。 前面我们完成了 1.结构初始化&#xff08;统一结果返回之类的&#xff0c;还有包的分类&#xff09; 2.加密&#xff08;基于Hutool进行的对称与非对称加密&#xff09; 3.用户注册 接下来我们先完善一下结构&#xff08;统一异常处理&#…

【vs2022的C#窗体项目】打开运行+sql Server改为mysql数据库+发布

1. vs2022打开运行原sql Server的C#窗体项目更改为mysql数据库 1.1. vs2022安装基础模块即可 安装1️⃣vs核心编辑器2️⃣.net桌面开发必选&#xff0c;可选均不安装&#xff01;&#xff01;&#xff01; 为了成功连接mysql数据库&#xff0c;需要安装组件NuGet包管理器 安…

AI 编程 “幻觉” 风险频发?飞算 JavaAI 硬核技术筑牢安全防线

AI 技术已深度融入编程领域&#xff0c;为开发者带来前所未有的便利与效率提升。然而&#xff0c;AI 编程 “幻觉” 问题如影随形&#xff0c;频频引发困扰&#xff0c;成为阻碍行业稳健发展的潜在风险。飞算 JavaAI 凭借一系列硬核技术&#xff0c;强势出击&#xff0c;为攻克…

数据库----软考中级软件设计师(自用学习笔记)

目录 1、E-R图 2、结构数据模型 3、数据库的三级模式结构 4、关系代数 5、查询 6、SQL控制语句 7、视图​编辑 8、索引 9、关系模式 10、函数依赖 11、通过闭包求候选码 12、范式 13、无损连接和保持函数依赖 14、数据库设计 15、数据库的控制功能 16、数据库…

【Qt】Qt常见控件的相关知识点

1.close退出槽函数 2.设置快捷键&#xff0c;QMenu 。 适用&字母就能设置快捷键&#xff0c;运行qt程序&#xff0c;最后就可以按Alt对应的字母进行快捷操作。 3.QMenuBar内存泄露问题 如果ui已经自动生成了menubar&#xff0c;我们再次生成一个新的菜单栏&#xff0c;而…

httpx[http2] 和 httpx 的核心区别及使用场景如下

httpx[http2] 和 httpx 的核心区别在于 HTTP/2 协议支持&#xff0c;具体差异及使用场景如下&#xff1a; 1. 功能区别 命令/安装方式协议支持额外依赖适用场景pip install httpx仅 HTTP/1.1无通用请求&#xff0c;轻量依赖pip install httpx[http2]支持 HTTP/2需安装 h2>3…

Spring Boot 中 MyBatis 与 Spring Data JPA 的对比介绍

一、核心概念 MyBatis 定义&#xff1a;基于 SQL 的持久层框架&#xff0c;提供灵活的 SQL 映射和自定义查询能力。 特点&#xff1a; 开发者手动编写 SQL&#xff08;XML 或注解&#xff09;。 支持动态 SQL、复杂查询优化。 轻量级&#xff0c;对数据库控制力强。 Spri…

k8s1.27集群部署mysql8.0双主双从

环境介绍&#xff1a; #节点分配 159m--->两个master&#xff0c;生产环境建议&#xff0c;一个master一个节点。 160n-->slave-0 161n-->slaves-0 #存储卷 pv-->放在节点上&#xff0c;没用nfs/云存储。hostpath方式存储。pv的资源分配1G&#xff0c;较小&#…

vivado fpga程序固化

一般下载到fpga上的程序在掉电之后就会丢失&#xff0c;如果想要掉电之后程序不丢失&#xff0c;就需要将比特流文件固化到板载的flash上。 以下以我的7a100t开发板为例&#xff0c;介绍程序固化的流程 点击OK就可以下载了。

RabbitMQ Topic RPC

Topics(通配符模式) Topics 和Routing模式的区别是: topics 模式使⽤的交换机类型为topic(Routing模式使⽤的交换机类型为direct)topic 类型的交换机在匹配规则上进⾏了扩展, Binding Key⽀持通配符匹配(direct类型的交换机路 由规则是BindingKey和RoutingKey完全匹配) 在top…

服务器死机了需要检查哪些问题

在这个数字化的时代&#xff0c;服务器就像是我们信息世界的“大管家”&#xff0c;可要是它突然死机了&#xff0c;那可真是让人头疼。今天咱们就来聊聊&#xff0c;服务器死机了&#xff0c;到底需要检查哪些问题。 一、硬件问题 电源供应&#xff1a;检查电源是否稳定&…

【MySQL成神之路】运算符总结

MySQL运算符总结 MySQL提供了丰富的运算符&#xff0c;用于在SQL语句中进行各种计算和比较操作。这些运算符可以分为算术运算符、比较运算符、逻辑运算符、位运算符等几大类。合理使用这些运算符可以构建复杂的查询条件和计算表达式。 一、算术运算符 MySQL支持基本的算术运…

自用Vscode 配置c++ debug环境

前言 使用vscode配置c debug环境的好处 1、可以借助vscode方便轻量的扩展和功能 2、避免了传统使用gdb 复杂按键以及不够直观的可视化 3、方便一次运行&#xff0c;断点处查看变量&#xff0c;降低找bug难度 4、某大公司项目采用类似配置&#xff0c;经过实践检验 配置c运行环…

创建一个使用 GPT-4o 和 SERP 数据的 RAG 聊天机器人

亮数据-网络IP代理及全网数据一站式服务商屡获殊荣的代理网络、强大的数据挖掘工具和现成可用的数据集。亮数据&#xff1a;网络数据平台领航者https://www.bright.cn/?promogithub15?utm_sourceorganic-social-cn&utm_campaigncsdn 本指南将解释如何使用 Python、GPT-4…

吴恩达 Deep Learning(1-36)ppt逐行理解

课程地址&#xff1a;(超爽中英!) 2024公认最好的【吴恩达深度学习】教程&#xff01;附课件代码 Professionalization of Deep Learning_哔哩哔哩_bilibili 1.目录 2.什么是神经网络 3.用神经网络进行监督学习 4.为什么深度学习会兴起 7.二分分类 适用于二元分类问题的函数&…

三维点云的处理

1 点云原理 https://zh.wikipedia.org/wiki/%E9%BB%9E%E9%9B%B2 点云&#xff08;英语&#xff1a;point cloud&#xff09;是空间中点的数据集&#xff0c;可以表示三维形状或对象&#xff0c;通常由三维扫描仪获取。点云中每个点的位置都由一组笛卡尔坐标(X,Y,Z)描述[1]&…

鸿蒙HarmonyOS多设备流转:分布式的智能协同技术介绍

随着物联网和智能设备的普及&#xff0c;多设备间的无缝协作变得越来越重要。鸿蒙&#xff08;HarmonyOS&#xff09;作为华为推出的新一代操作系统&#xff0c;其分布式技术为实现多设备流转提供了强大的支持。本文将详细介绍鸿蒙多设备流转的技术原理、实现方式和应用场景。 …