在 Oracle 数据库的内存管理中,共享池(Shared Pool)和大池(Large Pool)是 SGA(系统全局区)中负责缓存与资源分配的核心组件。合理配置和调优这两个池,能显著提升数据库性能 —— 尤其是在减少解析开销、降低锁竞争、优化内存利用率等方面。本文基于 Oracle 19c 官方文档,系统梳理共享池与大池的调优思路、关键配置及实践方法。

共享池:核心缓存与解析优化的关键

        共享池是 SGA 中用于缓存 SQL/PLSQL 代码、数据字典信息、结果集等核心数据的内存区域。其核心价值在于通过重用已解析的代码和字典数据,减少 CPU 消耗、降低 I/O 操作,并避免频繁的内存锁竞争。

一、共享池的核心组件与作用

共享池的性能直接取决于内部组件的高效运作,主要包含以下核心部分:

  • 库缓存(Library Cache):存储 SQL/PLSQL 代码的可执行形式(解析或编译后)。当执行 SQL 时,若库缓存中存在可重用的解析结果(软解析),可避免重新解析(硬解析);反之则需执行硬解析,消耗更多 CPU 和内存资源。
  • 数据字典缓存(Data Dictionary Cache):缓存数据字典元数据(如用户名、表空间信息、权限定义等)。数据库解析 SQL 或编译 PLSQL 时需频繁访问这些信息,缓存命中可减少磁盘 I/O。
  • 服务器结果缓存(Server Result Cache,可选):存储查询或 PLSQL 函数的结果,适用于重复执行且结果稳定的场景(如静态报表查询)。
  • 保留池(Reserved Pool):共享池内部分割的专用区域,用于分配超过 5KB 的大对象(如大型 PLSQL 包),避免因内存碎片导致的分配失败。

二、共享池高效使用的核心原则

        要发挥共享池的性能优势,需从应用设计和数据库配置两方面入手,核心目标是最大化软解析、减少硬解析

1. 优先使用绑定变量,避免字面量 SQL

        硬解析的主要诱因之一是 SQL 语句中使用字面量(如SELECT * FROM employees WHERE dept_id=10)而非绑定变量(如SELECT * FROM employees WHERE dept_id=:dept_id)。字面量 SQL 即使逻辑相同,也会被视为不同语句,导致库缓存无法重用。

  • 实践建议
    • 开发时强制使用绑定变量,避免动态拼接含字面量的 SQL;
    • 对无法修改的 legacy 应用,可通过设置CURSOR_SHARING=FORCE(默认EXACT)让数据库自动将字面量替换为绑定变量(需注意:可能影响执行计划适应性,建议结合自适应游标共享使用)。
2. 标准化 SQL 编写规范

        Oracle 判断 SQL 是否可共享的标准是 “完全一致”—— 包括大小写、空格、注释、对象引用等。例如以下语句会被视为不同 SQL:

SELECT * FROM employees;
SELECT * FROM Employees; -- 大小写不同
SELECT *  FROM employees; -- 空格数量不同
  • 实践建议:统一 SQL 格式(如自动转为大写、压缩空格),避免注释嵌入 SQL;使用显式对象所有者(如hr.employees)而非依赖公有同义词。
3. 控制游标生命周期,减少解析频率

频繁关闭和重新打开游标会导致重复解析。应根据 SQL 执行频率优化游标管理:

  • 对高频执行的 SQL(如 OLTP 核心交易),保持游标打开并重用(如通过 OCI 保留游标、JDBC 设置语句缓存);
  • 对低频执行的 SQL,可关闭游标释放内存,避免长期占用共享池。
4. 避免高峰时段执行 DDL

DDL 操作(如ALTER TABLE)会导致依赖的 SQL 失效(INVALIDATIONS),触发大量硬解析。例如修改表结构后,所有引用该表的 SQL 需重新解析。

  • 实践建议:DDL 尽量在低峰期执行;执行后可通过DBMS_SHARED_POOL.KEEP将核心 SQL 重新固定到共享池。

三、共享池的配置与调优

共享池的调优核心是 “合理 sizing”—— 既保证缓存高频数据,又不浪费内存。需结合监控指标动态调整。

1. 共享池大小调整(SHARED_POOL_SIZE)
  • 初始配置:OLTP 系统建议共享池占 SGA 的 20%-30%;DSS 系统可适当降低(因 SQL 重复率低)。
  • 监控指标
    • 通过V$LIBRARYCACHE查看RELOADS(缓存项被换出后重新加载的次数):理想值接近 0,若持续增长需增大共享池;
    • 通过V$ROWCACHE计算数据字典缓存命中率:(SUM(gets - getmisses)/SUM(gets))*100,应高于 90%;
    • 通过V$SGASTAT查看共享池 “free memory”:长期空闲内存过多说明配置过大,需缩减。
  • 调整方法:通过ALTER SYSTEM SET SHARED_POOL_SIZE = <size>M;动态调整(需确保 SGA 有足够余量)。
2. 保留池配置(SHARED_POOL_RESERVED_SIZE)

保留池用于大对象分配,默认值为共享池的 5%。若大对象分配频繁失败(如 PLSQL 包编译报错),需调整:

  • 监控指标V$SHARED_POOL_RESERVED中的REQUEST_FAILURES(分配失败次数):若大于 0 且增长,需增大保留池;
  • 配置原则SHARED_POOL_RESERVED_SIZE建议不超过共享池的 10%(避免挤压普通缓存区),调整时需同步增大SHARED_POOL_SIZE(保留池从共享池中划分)。
3. 游标缓存与固定(减少换出)
  • 会话游标缓存:通过SESSION_CACHED_CURSORS设置每个会话缓存的关闭游标数量(默认 50),减少重复解析。可通过V$SESSTAT中 “session cursor cache hits” 监控命中率,若低于 5% 需增大该值。
  • 固定核心对象:通过DBMS_SHARED_POOL.KEEP将高频使用的 SQL、PLSQL 包固定在共享池(避免被 LRU 算法换出),例如:
    -- 固定指定SQL(需先获取SQL_ID)
    SELECT address, hash_value FROM v$sql WHERE sql_id = 'abc123';
    EXEC DBMS_SHARED_POOL.KEEP(address => '<address>', flag => 'C');
    

大池:隔离大型内存分配,减少共享池碎片

大池是独立于共享池的内存区域,专为大型内存分配设计(如共享服务器会话内存、并行查询缓冲区、RMAN 备份缓冲区)。其核心价值是避免大型分配导致共享池碎片化,保障库缓存和字典缓存的稳定性。

一、大池的适用场景

大池并非必需组件,但在以下场景中建议配置:

  • 共享服务器架构:共享服务器的 UGA(用户全局区)需从大池分配(而非共享池),避免挤占 SQL 缓存内存;
  • 并行查询:并行执行的消息缓冲区从大池分配,减少共享池压力;
  • RMAN 备份 / 恢复:RMAN 的 I/O 缓冲区(通常数百 KB)从大池分配,避免共享池碎片。

二、大池的配置与调优

大池无 LRU 机制(不会主动换出对象),配置需基于实际内存需求。

1. 大池大小调整(LARGE_POOL_SIZE)
  • 初始配置:根据使用场景估算:
    • 共享服务器:每个会话约需 200-300KB,按最大并发会话数计算(如 100 会话需 30MB);
    • 并行查询:每个并行服务器进程约需 1-2MB,按最大并行度计算;
    • RMAN:单通道约需 1-4MB,按并发通道数计算。
  • 监控指标:通过V$SGASTAT查看大池 “free memory”:若长期不足(频繁分配失败)需增大,若长期空闲需缩减;
  • 配置方法ALTER SYSTEM SET LARGE_POOL_SIZE = <size>M;(最小 300KB)。
2. 避免大池与共享池竞争

大池和共享池均属于 SGA,需合理分配总内存:

  • 若同时使用共享服务器和大量 SQL 解析,需优先保证共享池大小;
  • 大池仅分配必要内存(无需预留过多),避免挤压其他 SGA 组件(如缓冲区缓存)。

自动管理与手动调优的选择

Oracle 提供自动内存管理(AMM)和自动共享内存管理(ASMM),可自动调整共享池和大池大小:

  • AMM(MEMORY_TARGET):完全自动管理 SGA 和 PGA,无需手动设置SHARED_POOL_SIZE等参数;
  • ASMM(SGA_TARGET):自动调整 SGA 内部组件(包括共享池、大池),可指定SHARED_POOL_SIZE为最小值。

建议:对于复杂环境(如混合 OLTP 和 DSS),可启用 ASMM 并设置共享池和大池的最小值,兼顾自动调整与核心需求;简单环境可直接使用 AMM 减少运维成本。

总结:共享池与大池调优的核心思路

共享池和大池的调优本质是 “平衡缓存效率与内存利用率”:

  • 共享池需聚焦 “减少硬解析”—— 通过绑定变量、标准化 SQL、合理 sizing 实现;
  • 大池需聚焦 “隔离大分配”—— 在共享服务器、并行查询等场景中配置,避免共享池碎片化。

实际调优中,需结合V$LIBRARYCACHEV$ROWCACHEV$SGASTAT等视图监控实时状态,避免 “一刀切” 配置。记住:最优配置永远基于实际 workload,而非理论值。

如需更详细的参数说明,可参考 Oracle 官方文档:Tuning the Shared Pool and the Large Pool。

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

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

相关文章

C# Lambdab表达式 Var 类

Lambdab 是用于创建一个方法的表达式Func<参数1类型, 参数2类型, 返回值类型> fnName >(参数1 参数2) {方法代码体}Func<int, int, bool> fnName (int a, int b) > {return a > b; };//调用时和普通方法一致 Console.WriteLine(fnName(10,20)); // false…

【Python】常见模块及其用法

文章目录1. 什么是模块和包&#xff1f;2. 常见的模块及其用法2.1 time概览2.1.1 时间获取方法2.1.2 时间格式化与解析2.1.3 程序计时与延迟2.1.4 时间转换2.2 random概览2.2.1 基本随机数2.2.2 随机整数2.2.3 序列操作2.2.4 概率分布2.2.5 随机种子2.2.6 状态管理2.3 os概览2.…

洛谷 P3478 [POI 2008] STA-Station

【题目链接】 洛谷 P3478 [POI 2008] STA-Station 【题目考点】 1. 树形动规&#xff1a;换根动规 换根动规&#xff0c;又名二次扫描法&#xff0c;一般是给一颗不定根树&#xff0c;通过两次扫描来求解。 我们可以先任选一个根结点root&#xff0c;通过树形动规的思想计算…

【爬虫】03 - 爬虫的基本数据存储

爬虫03 - 爬虫的数据存储 文章目录爬虫03 - 爬虫的数据存储一&#xff1a;CSV数据存储1&#xff1a;基本介绍2&#xff1a;基本使用3&#xff1a;高级使用4&#xff1a;使用示例二&#xff1a;JSON数据存储1&#xff1a;基础json读写2&#xff1a;字符串和对象的转换3&#xff…

深入分析计算机网络数据链路层和网络层面试题

计算机网络体系结构1. 请简述 OSI 七层模型和 TCP/IP 四层模型&#xff0c;并比较它们的异同。OSI 七层模型&#xff1a;应用层&#xff1a;直接为用户的应用进程提供服务&#xff0c;如 HTTP&#xff08;超文本传输协议&#xff0c;用于 Web 浏览器与服务器通信&#xff09;、…

云服务器新装的mysql8,无法通过远程连接,然后本地pymysql也连不上

阿里云服务器&#xff0c;用apt-get新装的mysql-server&#xff0c;竟然无法通过远程连接到&#xff0c;竟然是这个原因。不是防火墙&#xff0c;iptables早就关了。也不是安全组&#xff0c;不是人为限制访问的话&#xff0c;根本没必要弄安全组 排查过程 netstat -antop|grep…

质量即服务:从测试策略到平台运营的全链路作战手册

&#xff08;零&#xff09;为什么需要“质量即服务” 当业务方说“今晚一定要上线”&#xff0c; 当开发说“我只改了两行代码”&#xff0c; 当运维说“回滚窗口只有 5 分钟”&#xff0c; 质量必须像水电一样随取随用&#xff0c;而不是上线前的大坝泄洪。 这篇手册提供一张…

Java -- 自定义异常--Wrapper类--String类

自定义异常&#xff1a;概念&#xff1a;当程序中出现了某些错误&#xff0c;但该错误信息并没有在Throwable子类中描述处理&#xff0c;这个时候可以自己设计异常&#xff0c;用于描述该错误信息。步骤&#xff1a;1. 定义类&#xff1a;自定义异常类名&#xff08;程序员自己…

一文速通《线性方程组》

目录 一、解题必记知识点 二、解题必备技巧 三、非齐次线性方程组求解 四、齐次线性方程组求解 ★五、解析题目信息&#xff0c;获取暗含条件 一、解题必记知识点 (1) (2)基础解系线性无关&#xff0c;基础解系 解空间的一个基&#xff0c;基 一组线性无关的、能够生…

【Django】DRF API版本和解析器

讲解 Python3 下 Django REST Framework (DRF) API 版本控制解析器&#xff08;Parser&#xff09;一、DRF API 版本控制详解 API 版本控制是构建健壮、可维护的 RESTful API 的关键&#xff0c;尤其在项目演进中需要兼容不同版本的客户端请求。 1.1 API 版本控制的核心原理 AP…

Windows系统暂停更新工具

功能说明 暂停更新至2999年恢复系统更新彻底禁用更新&#xff08;不可逆&#xff09; 使用方法 下载解压后双击运行 .bat 文件 输入数字选择功能&#xff1a; 输入 1&#xff1a;暂停更新至2999年&#xff08;推荐&#xff09;输入 2&#xff1a;恢复系统更新输入 3&#xf…

git push新版问题解决

git 好像不能通过username:password的方式来git push了。但我的电脑依然弹出username和password的弹窗。转战ssh来git push。由于之前是用git clone克隆的&#xff0c;需要再转换成ssh的url来git push。

PyCharm + AI 辅助编程

PyCharm AI&#xff1a;初学者友好的 2 个实用场景&#xff08;附操作步骤&#xff09; PyCharm 专业版&#xff08;或通过插件集成&#xff09;支持 AI 辅助编程&#xff08;如 JetBrains AI 或 GitHub Copilot&#xff09;&#xff0c;能根据代码上下文自动生成代码、解释逻…

疯狂星期四文案网第15天运营日记

网站运营第15天&#xff0c;点击观站&#xff1a; 疯狂星期四 crazy-thursday.com 全网最全的疯狂星期四文案网站 运营报告 昨日访问量 昨天只有20来ip, 太惨了&#xff0c;感觉和最近没有发新段子有关&#xff0c;也没有发新的外链&#xff0c;不知道这周四会怎么样 昨日搜…

如何解决pip安装报错ModuleNotFoundError: No module named ‘Cython’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘Cython’问题 摘要 在使用 PyCharm 控制台或命令行执行 pip install Cython 时&#xff0c;常会遇到 ModuleNotFoundError: No module named Cython 的报错。本…

freertos任务调度关键函数理解 vTaskSwitchContext

void vTaskSwitchContext(void) {//my_printf( "uxSchedulerSuspended %d\n", uxSchedulerSuspended );/* 调度器处于挂起状态 */if (uxSchedulerSuspended ! (UBaseType_t)pdFALSE) {/*** The scheduler is currently suspended - do not allow a context* switch.…

CPU 密集型 和 I/O 密集型 任务

文章目录**CPU 密集型任务&#xff08;CPU-bound&#xff09;**定义&#xff1a;特点&#xff1a;常见场景&#xff1a;如何优化 CPU 密集型任务&#xff1a;**I/O 密集型任务&#xff08;I/O-bound&#xff09;**定义&#xff1a;特点&#xff1a;常见场景&#xff1a;如何优化…

[2025CVPR-小目标检测方向]基于特征信息驱动位置高斯分布估计微小目标检测模型

核心问题 ​小目标检测性能差&#xff1a;​​ 尽管通用目标检测器&#xff08;如 Faster R-CNN, YOLO, SSD&#xff09;在常规目标上表现出色&#xff0c;但在检测微小目标&#xff08;如 AI-TOD 基准定义的&#xff1a;非常小目标 2-8 像素&#xff0c;小目标 8-16 像素&…

三大工厂设计模式

1.简单工厂模式1.1需求入手从需求进行入手&#xff0c;可以更深入的理解什么是设计模式。有一个制作披萨的需求&#xff1a;需要便于扩展披萨的种类&#xff0c;便于维护。1.披萨的种类有很多&#xff1a;GreekPizz&#xff0c;CheesePizz等2.披萨的制作流程&#xff1a;prepar…

SpringBoot--Mapper XML 和 Mapper 接口在不同包

&#x1f9e9; 背景说明在 Spring Boot 中&#xff0c;MyBatis 默认要求 Mapper 接口和 XML 文件位于相同包路径。 但在实际项目中&#xff0c;为了模块化或结构清晰&#xff0c;常将 XML 放在 resources/mybatis/... 下&#xff0c;这种做法就必须进行额外配置。&#x1f4c1;…