我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。
本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。
Oracle数据库内存结构:系统全局区(SGA)详解
什么是SGA?
系统全局区(SGA)是Oracle数据库实例的核心内存结构,每个Oracle进程都会在某个时刻访问它。SGA的大小可以从几十MB(小型测试系统)到几GB(中型系统),甚至数百GB(超大型系统)。
如何查看SGA?
在Linux/Unix系统上,SGA是一个物理实体,可以通过命令查看:
$ ipcs -m | grep ora
在Windows上,Oracle作为单一进程运行,SGA是其私有内存的一部分,无法直接查看。
在Oracle内部,可以通过V$SGASTAT视图查看SGA详细信息:
SQL> select pool, name, bytes from v$sgastat order by pool, name;
SGA的主要组件
SGA由多个内存池组成:
- 共享池(Shared pool):存储共享游标、存储过程等
- 数据库缓冲区缓存(Database buffer cache):缓存从磁盘读取的数据块
- 固定SGA(Fixed SGA):包含实例和数据库状态信息
- 重做日志缓冲区(Redo log buffer):临时存储数据库更改信息
- Java池(Java pool):为数据库中的JVM分配内存
- 大池(Large pool):用于共享服务器连接等
- 流池(Streams pool):用于数据共享工具
关键内存管理参数
影响SGA大小的主要参数包括:
JAVA_POOL_SIZE
:控制Java池大小SHARED_POOL_SIZE
:控制共享池大小DB_*_CACHE_SIZE
:控制各种缓冲区缓存大小SGA_TARGET
:用于自动SGA内存管理MEMORY_TARGET
:自动管理PGA和SGA
内存分配单位:颗粒(Granule)
SGA内存分配以"颗粒"为单位进行,颗粒大小取决于SGA总大小:
- SGA<1GB时:颗粒通常为4MB
- SGA>1GB时:颗粒可能为16MB
可以通过查询查看当前颗粒大小:
SQL> select component, granule_size from v$sga_dynamic_components;
重做日志缓冲区
重做日志缓冲区是临时存储重做数据的内存区域,由LOG_BUFFER
参数控制。Oracle建议:
- 至少8MB
- 使用闪回功能且SGA>4GB时,至少64MB
- 使用Data Guard异步传输时,至少256MB
数据库块缓冲区缓存
这是SGA中最重要的组件之一,用于缓存数据块。包含三个主要区域:
- 默认池(Default pool):主要缓存区域
- 保留池(Keep pool):用于频繁访问的段
- 回收池(Recycle pool):用于大型随机访问段
Oracle使用触摸计数算法管理缓存块,频繁访问的块会保留在缓存中。
多种块大小支持
Oracle支持在同一数据库中使用不同块大小,但需要为每种非默认块大小配置专用缓存:
SQL> alter system set db_16k_cache_size = 16m;
多种块大小主要用于可传输表空间功能,也可用于特定性能调优场景。
总结
SGA是Oracle数据库性能的关键因素,合理配置各个内存组件对数据库性能至关重要。现代Oracle版本提供了自动内存管理功能,简化了SGA配置,但理解其内部工作原理对于性能调优和故障排除仍然非常重要。
------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)