如何整理oracle share pool 碎片,Oracle shared pool 学习之内存分配

因工作中频繁遇到ORA-4031错误,每次都知其然不知其所以然,于是决心从原理上弄明白Shared Pool。此文仅为分享学习所得,不当之处请指正。

一、Shared Pool 组成

Shared Pool 简单来说主要有数据字典缓存(Row Cache)、库缓存(library Cache)组成,从9i开始也包括子池(Reserved Pool),当然远不止这些。对于数据字典缓存(Row Cache)的翻译本人也一直很好奇为什么。

查阅Oracle官方文档解释如下:

The data dictionary is accessed so often by Oracle Database that the following special memory locations are designated to hold dictionary data:

Data dictionary cache

This cache holds information about database objects. The cache is also known as the row cache because it holds data as rows instead of buffers.

可以得知数据字典缓存数据字典信息是通过rows的方式而不是想DB Cache一样是通过块(block)的方式。

这样通过之前学习的知识可以简单理解贯通一下,大家都知道Shared Pool 的功能主要是共享sql 游标、执行计划、数据字典信息等。数据字典信息主要是在sql phrase 阶段通过recursive sql

访问数据字典表获得。和普通SQL语句一样查询数据字典表或得的row data 都会先缓冲到DB Cache中,为了减少recursive SQL的开销也会缓冲到数据字典缓存(Row data)中,这些数据以rows的方式存放。

二、Shared Pool内存管理

1、Oracle 中所有内存都是以堆的方式存在,其空间管理概念基本上都是堆内存管理的方式(KGH)。

每个堆都可以拥有自己的子堆,比如Shared Pool就是 SGA的子堆,Row Cache就是 Shared Pool的子堆。堆的简单构成如下图:

26723566_14440489322WVv.jpg

如图,堆是有对句柄和一系列的扩展内存组成。对句柄是由一组freelist buckets 和相应的buckets size组成。chunk的类型有:permanent、freeable、recreateable、freeable with mark。permanent类型的chunk一旦分配就是永久的在堆的生命周期内不会被解锁和释放。 freeable这类chunk一旦使用完毕就可以立即被释放并回收利用。recreateable这类chunk可以被解锁释放,在解锁后使用LRU算法进行管理。Freeable with mark这类chunk和freeable 差不多,在用用后也可以被回收使用。不过和freeable的区别是这类chunk的空间使用必须达到指定的值时才可以被释放。

2、堆的创建

创建堆需要初始化堆句柄使用kghini()并定义两个参数a)堆的freelist buckets 中buckets的数量 b)定义句柄的大小

3、堆的空间分配

26723566_1444050961p2Iv.jpg

3、如何在Freelist链表中查找可用chunk

26723566_144405153846kC.jpg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值