ORACLE 在内存管理机制上的演变和进化

news2024/11/18 11:47:59

截止目前,计算机内存仍然被认为是我们可以获得的最快速度的物理存储设备。

将频繁访问的数据尽可能地置于内存中,已成为当前各种软件和应用程序提高数据访问性能,减少访问延迟的最为有效的途径。

分层存储架构

然而,内存作为关键的计算资源,不仅受限于其易失性,一旦电源中断或计算机重新启动,内存中的数据将被重置,保存于其中信息会丢失,

同时相对于大容量存储设备,比如硬盘来说,也受限于其昂贵的价格和有限的容量。

这给许多关键业务数据库系统提出了二个重要问题:

1. 如何在确保卓越性能的同时,有效地管理内存?
2. 以及如何将有限的内存资源有效分配给待处理数据?

因此,如何在内存限制下充分利用数据库的内存管理机制,以实现卓越性能和数据持久性的平衡。已经成为软件设计架构中一个至关重要的挑战。

在解决这一挑战时,数据库的内存管理机制设计起到了至关重要的作用。
数据库系统可以充分利用内存来提高数据的访问性能,

并将数据分成不同的层次,

根据访问频率和重要性将最常用的数据存储在内存中。

这种策略有助于减轻磁盘I/O的负担,从而提高了系统的响应速度。

但是,内存数据的易失性仍然是一个问题。

为了确保数据的持久性,数据库需要实施数据持久化策略,

如事务日志记录和定期快照。

这些策略将内存中的数据变更定时同步到持久性存储介质上,以防止数据丢失。

此外,数据库的内存管理和性能优化也必不可少。

合理的内存分配和性能优化可以确保关键数据始终在内存中得到高效处理,

从而提供更快的查询响应时间,优化用户的体验。

接下我们看下 ORACLE 数据库在内存管理机制上的演变和进化。

Oracle 数据库在40多年的发展过程中,内存管理机制在不同版本中经历了多次演变和进化:

Oracle 7 和 8i

  • Oracle 7 和 8i的内存管理是基于静态参数的设置。DBA需要手动配置SGA和PGA的各个组件的大小,如SHARED_POOL_SIZE、BUFFER_POOL_SIZE、SORT_AREA_SIZE等。

Oracle 9i

  • Oracle 9i 引入了自动共享池管理(ASMM)。DBA需要设置SGA_TARGET参数,然后Oracle数据库会自动调整SGA中的共享池和其他组件的大小。

Oracle 10g

  • Oracle 10g 引入了自动PGA管理。DBA可以设置PGA_AGGREGATE_TARGET参数,数据库会自动管理PGA内存。

Oracle 11g

  • Oracle 11g 改进了ASMM,引入了自动共享池大小调整(Auto SGA)。此外,11g引入了SGA目标和PGA目标,DBA可以设置这些目标参数,而不再需要设置具体的SGA和PGA组件参数。

Oracle 12c

  • Oracle 12c 进一步加强了自动化。引入了内存管理的自动化功能,根据性能指标和工作负载的需求来动态调整内存分配。还引入了In-Memory列存储选项,允许将列存储在内存中以提高查询性能。

Oracle 18c 和 19c

  • 这些版本继续改进了内存管理的自动化,以适应不断变化的工作负载需求。引入了自动调整SGA和PGA大小的机制,以优化性能。

小结:

从Oracle 8i到9i —— 9i解决了PGA的自动管理。

从Oracle 9i到10g —— 10g解决了SGA的自动管理。

从Oracle 10g到11g —— 11g解决了整个内存(SGA+PGA)的自动管理。

从Oracle 12c到19c —— 12c引入了内存管理的自动化和 In-Memory列存储。

在Oracle数据库的不同版本中,内存管理方式经历了重要的演变和创新。

在Oracle Database 9i中,PGA可以自动管理,但是各个SGA组件的内存大小必须由数据库管理员(DBA)手动设置,这需要精确的调整和配置。

然而,随着Oracle Database 10g的推出,引入了一项新的选择:自动SGA内存管理。这一功能的引入标志着数据库开始具备内存智能自动化管理的能力,根据实际工作负载情况,在运行时分配和重新分配SGA组件的内存大小。这使得数据库管理变得更加灵活和高效。

在Oracle Database 10g及更高版本中使用自动SGA内存管理时,只需设置SGA_TARGET参数为所期望的SGA总大小,而无需考虑其他繁琐的SGA相关参数。数据库实例会接管具体的SGA设置工作,根据工作负载的需求为各个SGA池分配内存,并经过一段时间的运行后,还会根据实际情况智能地调整各个池的大小。

随着时间的推移,Oracle Database 11g再次带来了一项创新,即自动共享内存管理(Auto Shared Memory Management)【ASMM】,同时基于 ASMM 拓展出了自动内存管理 Automatic Memory Management【AMM】。

采用自动内存管理时,数据库实例不仅会利用自动SGA内存管理和自动PGA内存管理,还会根据工作负载的需要自动确定SGA和PGA的最佳大小,并在必要时进行自动调整。这使得数据库的性能优化变得更加智能和自动化。

在Oracle Database 11g及更高版本中,使用自动内存管理变得更加简单,只需设置MEMORY_TARGET参数即可。

数据库实例会智能地确定最佳的SGA和PGA大小,然后分别使用自动SGA内存管理和自动PGA内存管理来适当地配置它们内部的各个组件。

同样,随着时间的推移,数据库还会根据工作负载的变化自动调整SGA和PGA的分配,无需手动干预。

在ORACLE自动内存管理中涉及到的数据库参数包括:

  • memory_max_target
  • memory_target
  • sga_max_size
  • sga_target
  • pga_aggregate_target

如何启用自动内存管理?
方式一:在DBCA图形界面创建数据库时,可以选择“使用自动共享内存管理”。

注意:当服务器配置的内存超过4GB时,在12.2之前版本中会出现告警提示不建议使用AMM。但是从12.2开始,当主机内存大于4GB就会直接报错不允许使用自动内存管理模式,无法继续安装数据库了。

在这里插入图片描述

对此MOS文档做了说明:

12.2: [INS-35178] The Automatic Memory Management Option Is Not Allowed During RunInstaller or Using DBCA If Physical Memory Is Greater Than 4G. (文档 ID 2244817.1)

因此当服务器配置的内存超过4GB时(现在的服务器内存配置基本上都会超过4GB),应当选择自动共享内存管理(Auto Shared Memory Management)【ASMM】模式。

安装时内存管理选项
方式二:可以通过以下两个参数之一启用

  • memory_target:定义sga和pga总和的上限
  • memory_max_taregt:定义memory_target的上限

如何查看 ORACLE 是否使用了自动内存管理?
要查看Oracle数据库是否使用了自动内存管理(AMM)还是自动共享内存管理(ASMM),您可以执行以下步骤:

  1. 使用DBA账户登录到Oracle数据库。

  2. 打开SQL*Plus或SQL开发工具,以便执行SQL查询。

  3. 运行以下SQL查询来查看数据库的内存管理方式:

SELECT name, value
FROM v$parameter
WHERE name LIKE 'memory_target' OR name LIKE 'sga_target';

在这里插入图片描述

此查询将显示与内存管理相关的参数及其值。

如果查询结果中包含MEMORY_TARGET参数,那么数据库正在使用自动内存管理(AMM)。

如果查询结果中包含SGA_TARGET参数,那么数据库正在使用自动共享内存管理(ASMM)。

如果两者都存在,说明数据库同时启用了AMM和ASMM。

请注意,要查看和更改这些参数,您需要具有DBA权限或系统管理员权限。

不建议在生产环境中随意更改这些参数,因为它们可能会影响数据库的性能和稳定性。

如果需要更改这些参数,请在详细了解其影响和进行充分测试之后由专业DBA谨慎操作。

无论是采用自动内存管理还是手动内存管理,都可以观察到内存分配是基于一种称为"颗粒度(granule)"的单位进行的。

颗粒度是一种最小的内存分配单位,通常大小为4MB、8MB或16MB。

这种颗粒度单位的使用使内存管理更加灵活,尤其是在SGA大小的调整方面。

通过下面的SQL语句查询 V$SGA_DYNAMIC_COMPONENTS 视图,

SELECT component, TO_NUMBER(granule_size) / 1024 / 1024 AS granule_size_MB
FROM v$sga_dynamic_components;

可以查看各个池中的颗粒大小,这有助于了解内存分配的细节。

实际上,还可以使用这个视图来查看SGA总大小如何影响颗粒大小。

当前系统使用 ASMM(自动共享内存管理模式),通过参数 SGA_TARGET 来控制 SGA的大小。

当 SGA 小于1GB 时,内存管理颗粒度为 4MB;

当 SGA 设置为超过 1GB 时,内存管理颗粒度为 16MB;

查询SGA信息
查询内存颗粒度动态视图
可以看到当 SGA 设置为 8GB 时,Oracle 会以 16MB 的颗粒度为内存池分配空间,所以内存池的大小都将是16MB 的某个倍数。

总之,Oracle数据库的内存管理机制在不同版本中经历了重要的创新,从手动设置逐渐演化为自动智能管理。

这些创新不仅提高了数据库性能,还减轻了DBA的管理负担,使数据库系统更加适应不断变化的工作负载需求。

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

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

相关文章

uni-app:showModal消息提示(确认、取消)

效果 代码 <template><view><button longpress"handleLongPress">点我出现删除消息</button></view> </template><script>export default {data() {return {};},methods: {handleLongPress(e) {//删除设备uni.showModal(…

小白vite+vue3搭建项目整个流程

第一步 查看npm 版本npm -v&#xff0c;npm版本是7&#xff0c;创建项目命令&#xff1a; npm create vitelatest threejsVue -- --template vue第二步 // 进入项目名为threejsVue的项目命令 cd threejsVue // 安装路由 npm install vue-router4 // 安装css npm install -D s…

uni-app实现图片预览

uni.previewImage预览图片 使用方法&#xff1a; <image class"poster" :src"imageUrl" mode"" click"previewImg(imageUrl)"></image>const previewImg (e) > {uni.previewImage({current: e,urls: image}); } 官…

Java+Vue 实现消息通知示例

前端代码部分&#xff1a; 右上方小铃铛组件 <template><div><el-popover placement"bottom" :width"280" trigger"click"><template #reference><el-badge :is-dot"isDot" class"item" style&…

【React】组件实例三大属性state、props、refs

state React 把组件看成是一个状态机&#xff08;State Machines&#xff09;。通过与用户的交互&#xff0c;实现不同状态&#xff0c;然后渲染 UI&#xff0c;让用户界面和数据保持一致。 React 里&#xff0c;只需更新组件的 state&#xff0c;然后根据新的 state 重新渲染用…

深信服应用交付 AD 存在远程命令执行漏洞 附POC

文章目录 深信服应用交付 AD 存在远程命令执行漏洞 附POC1. 深信服应用交付 AD 简介2.漏洞描述3.影响版本4.fofa查询语句5.漏洞复现6.POC&EXP7.整改意见8.往期回顾 深信服应用交付 AD 存在远程命令执行漏洞 附POC 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测…

命运2中文wiki搭建记录——MediaWiki安装与初设置

命运2中文wiki搭建记录 本文转自我的博客&#xff0c;原文地址——>命运2中文wiki搭建记录——MediaWiki安装与初设置 可能是出于闲的发霉&#xff0c;想自己搭建一个命运2wiki。 因为bilibili上的命运2Bwiki也全是自己搭的。指路——>命运2Bwiki 但是当自己实际上手Me…

USB 2.0 10/100M Ethernet Adaptor 有线网卡驱动

USB 2.0 10/100M Ethernet Adaptor有线网卡驱动&#xff0c;天蓝透明色和带线的USB网卡都适用卡&#xff0c;支持WIN7 32位。外接网卡&#xff0c;外置USB网卡驱动 平板电脑网卡驱动 以太网驱动亲测可用 USB2.0 Ethernet Adapter是USB2.0接口的以太网适配器即网卡。 把USB有线…

记录一个 GUI 库的对比测试结果

1&#xff0c;Java 的 JavaFX 2&#xff0c;golang 的 Fyne 1, Java 测试的是一个俄罗斯方块的 GUI 程序。一切正常。 2&#xff0c;Golang github 的原仓库网络问题&#xff0c;没能测试上&#xff0c;使用以下库 https://gitee.com/mirrors/Fyne 下载代码后提示“编译失…

【力扣2057】值相等的最小索引

&#x1f451;专栏内容&#xff1a;力扣刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、题目描述二、题目分析 一、题目描述 题目链接&#xff1a;值相等的最小索引 给你一个下标从 0 开始的整数数组 nums …

基于springboot实现二手交易平台管理系统演示【项目源码】分享

基于springboot实现二手交易平台管理系统演示 java简介 Java语言是在二十世纪末由Sun公司发布的&#xff0c;而且公开源代码&#xff0c;这一优点吸引了许多世界各地优秀的编程爱好者&#xff0c;也使得他们开发出当时一款又一款经典好玩的小游戏。Java语言是纯面向对象语言之…

中国沿海水产养殖空间分布数据集(1990-2022)

4年间隔的遥感信息提取中国沿海水产养殖空间分布数据集&#xff08;1990-2022&#xff09; 人口增长引起水产品需求快速增加&#xff0c;而野生捕捞产量受环境承载力的限制趋于饱和&#xff0c;这使得水产养殖业在过去数十年间迅速发展。水产养殖能够有效保障人类粮食安全和营养…

使用elementUI的form表单和Steps步骤条如何让rules分步骤校验

使用rules如何分步骤校验 一般如果我们使用form表单的时候都会用到rules来进行校验,那么如果加上步骤的应该如何校验呢? 我使用的方式是通过active 我们步骤1的时候 active是0, 步骤2的时候active是1 那我们在进行校验步骤1可以这样子写: :prop"active 0 ? title : …

主从复制是怎么实现的?

单机模式的缺点 Redis虽然有持久化技术保证Redis奔溃后重启可以恢复数据&#xff0c;但是&#xff0c;单机模式下还是存在两方面问题。一方面Redis一旦宕机&#xff0c;数据恢复需要一定的时间&#xff0c;这段时间内&#xff0c;都不能接收和处理请求&#xff1b;另一方面&am…

《IIS系列》IIS日志文件管理

我们在使用IIS部署网站的时候&#xff0c;随着时间推移&#xff0c;IIS 生成的日志文件可能会消耗大量磁盘空间。 日志可能会填满整个硬盘驱动器&#xff0c;为了缓解此问题&#xff0c;许多用户完全关闭日志记录&#xff0c;但关了记录又会导致出现问题无从排查&#xff0c;故…

C++手写NMS

文章目录 前言一、NMS是什么&#xff1f;二、代码展示三、代码实现思路总结 前言 目标检测模型推理后&#xff0c;一般都需要进行NMS操作进行多余框去重&#xff0c;板端部署一般不用opencv自带的NMS&#xff0c;所以记录下手写NMS的代码。 一、NMS是什么&#xff1f; 非极大…

ChatGPT Prompting开发实战(十二)

一、如何开发prompts实现个性化的对话方式 通过设置“system”和“user”等roles&#xff0c;可以实现个性化的对话方式&#xff0c;并且可以结合参数“temperature”的设定来差异化LLM的输出内容。在此基础上&#xff0c;通过构建一个餐馆订餐对话机器人来具体演示对话过程。…

Event Loop——事件循环

JS 是单线程的&#xff0c;也就是同一个时刻只能做一件事情。 那么思考&#xff1a;为什么浏览器可以同时执行异步任务呢&#xff1f;因为浏览器是多线程的。 当 JS 需要执行异步任务时&#xff0c;浏览器会另外启动一个线程去执行该任务。 也就是说&#xff0c;“JS 是单线程…

MATLAB算法实战应用案例精讲-【优化算法】Tiki-taka算法(TTA)(附MATLAB代码实现)

前言 Tiki-Taka战术体系曾经帮助西班牙国家队及巴塞罗那俱乐部取得了巨大的成功。然而,在2018年世界杯西班牙全场传球1100余次(职业比赛场均传球500次左右,西班牙场均800次左右)却被控球率只有20%的俄罗斯淘汰后,人们开始意识到大量机械的传球不但会让球迷觉得枯燥乏味,…

GEO生信数据挖掘(五)提取临床信息构建分组,分组数据可视化(绘制层次聚类图,绘制PCA图)

检索到目标数据集后&#xff0c;开始数据挖掘&#xff0c;本文以阿尔兹海默症数据集GSE1297为例 上节做了很多的基因数据清洗&#xff08;离群值处理、低表达基因、归一化、log2处理&#xff09;操作&#xff0c;本节介绍构建临床分组信息。 我们已经学习了提取表达矩阵的临床…