SHARED_POOL解析
共享池是SGA中的一部分,主要由以下几部分组成:
n 库缓存
n 数据字典缓存
n 用户全局区(共享服务器模式)
在这里需要注意的是,共享池的大小定义是由参数SHARED_POOL_SIZE来控制,要合理调整这个参数的大小,以为共享池的内容要比数据库数据缓存更消耗系统的资源。而调整共享池的重点是调整库缓存的命中率上来,因为,在解析时使用的算法中需要把持内存中的数据字典地时间要比库缓存数据的时间要长。
优化SHARED_POOL有以下的好处:
1、 避免过渡的SQL文的解析,这样可以节约服务器的CPU资源和终端用户的消耗时间。
2、 减少闩资源的使用。
3、 减少SHARED_POOL内存的使用量。
4、 节约I/O资源的使用,减少磁盘的访问量。
库缓存
存放的是共享SQL和PL/SQL的区域,全解析或者编译PL/SQL块和SQL语句。其中PL/SQL块包括:
过程
函数
包
触发器
匿名的PL/SQL块
库缓存是由几个命名空间来进行分组的。这个可以通过查询视图V$LIBRARY_CACHE_MEMORY来查询。
n 每一个对象类型仅仅只能属于一个命名空间
n 对象的名字在一个模式中的一个命名空间是唯一的
n 每个在缓存中的库对象有几个其他的组件与之关联
SQL> select lc_namespace from v$library_cache_memory; LC_NAMESPACE --------------- BODY CLUSTER INDEX JAVA DATA JAVA RESOURCE JAVA SOURCE OBJECT OTHER/SYSTEM PIPE SQL AREA TABLE/PROCEDURE TRIGGER 12 rows selected |
库缓存的对象
有两个层次的对象
n 由外在的SQL或者PL/SQL添加和删除的存储对象;例如表,视图,触发器等
n 在一个实例的阶段中添加或者执行的短暂对象;例如:共享游标。
共享游标
共享游标在库缓存中是一个可以执行的对象的内存表现;可能是一个SQL文,一个PL/SQL匿名块,也可以是过程或者函数。有两种表现形式:
具有名字的父游标
一个或者更多的子游标,每个子游标有不同的基础对象的设置,每个子游标包含着SQL的执行计划。
库缓存对象
库缓存对象的名字由三部分组成:
n 模式名
n 对象名
n 数据库连接名
例如 scott.emp@oracle.world
库缓存对象定义
状态标识
n 存在、不存在
n Being created /dropped /altered /updated
可用不可用标志
n 可用被授权
n 可用没有授权
n 编辑错误
n 权限改变
n 对象修改、添加删除
库对象表
n 独立表
每个对象引用只有一个入口
n 子表
n 翻译表
n 认证表
n 联系表
库缓存是分配在sga的顶部,是通过调用heap manager层来进行内存管理的。库缓存内存区域是通过构造一个hash表的结构来实现的,hash表中由一个hash buckets的队列来实现。每个hash buckets是一个库对象句柄的连接列表,这些句柄指向和标识出每个库缓存对象的地址。
库缓存管理器通过和内存heap manager协调,来请求分配和释放内存空间。对象在bucket中放置的位置是通过hash来指定的,oracle通过一种hash函数算法,利用对象的命名空间,命名,所有者和数据库链名来确定库缓存对象的位置。
当进程请求一个对象的时候,Oracle应用hash算法决定是那个hash buckets存放所需要对象的句柄,这个对象的句柄用于标识和定位库缓存对象,还有命名空间,名称,状态和当前对象锁的状态。
如果对象的数目变大的时候,当前初始化hash表的大小不够用。缺省的初始化大小是509,允许hash表扩展到7倍。同时也可以改变隐藏参数_kgl_bucket_count来设置,例如:如果设置为4,则初始化hash表的大小为8191。
算法:
使用的是LRU算法
优化库缓存
通过保持解析率最低来保持命中率。
n 确保用户能够共享SQL文。
n 通过分配足够的空间来保证SQL文不被老化。
n 避免不可用来减少重新解析。
避免碎片的产生:
n 为大的内存请求保留空间
n Pinging频繁请求的大的对象
n 去除大的匿名块
n 在共享服务器模式连接的时候使用大池
术语
Gets(parse)
查找对象的数目。
Pin(execution)
读或者执行对象的次数。
Reloads(reparse)
库缓存中在执行阶段没有找到,而造成隐形的重新编译语句和块的次数。
相关的视图
V$LIBRARY_CACHE_MEMORY
显示在不同的命名空间中,分配给库缓存内存对象的内存信息。内存对象是一组用于管理的内部组。库缓存时由一个或者几个内存对象组成。
SQL> select lc_namespace from v$library_cache_memory; LC_NAMESPACE --------------- BODY CLUSTER INDEX JAVA DATA JAVA RESOURCE JAVA SOURCE OBJECT OTHER/SYSTEM PIPE SQL AREA TABLE/PROCEDURE TRIGGER 12 rows selected |
V$LIBRARYCACHE
这个视图包含库缓存管理的统计信息。反映的是自从启动以来库缓存的统计信息。
V$SQLTEXT
没有被删除的完全SQL文,使用多行显示。
V$SQLAREA
所有共享游标的统计信息。
V$SQL
这个视图列出的是共享SQL区域中没有GROUP BY子句的统计信息。包含每一个子SQL文的入口。
库缓存的大小
数据字典缓存
保存的是在内存中保存字典对象的定义。
用户全局区(共享服务器模式)
是共享服务器模式下保存会话信息。
Library cache dump
SQL> alter session set events 'immediate trace name library_cache level 10'; 会话已更改。 SQL> |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/222350/viewspace-908031/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/222350/viewspace-908031/