理解共享池
共享池是SGA的一部分,用来缓存SQL和PL/SQL语句,共享池用LRU算法来管理。
语句缓存的好处
• ORACLE执行SQL语句时,先将SQL语句的字串通过一个哈希算法得出一个哈希值,然后检查共享池中是否已存在这个哈希值,若有就用已缓存的执行计划来执行这个语句(CACHE HIT 缓存命中),若没有(CACHE MISS 缓存缺失)则需进行解析,解析需要完成下面的工作:
Ø 语法检查;
Ø 语义检查,看参考对象是否存在,类型是否正确;
Ø (如果是CBO优化模式)收集参考对象的统计;
Ø 检查用户的权限是否足够;
Ø 从许多可能的执行路径中选择一条作为执行计划;
Ø 生成语句的编译版本(P-CODE)。
• 解析是一个昂贵的操作,因为过程中需要消耗许多资源;
• 最大化CACHE HIT是调整共享池的目标
共享池的组件
Library Cache (库缓存)
• 库缓存用来存放最近执行过的SQL和PL/SQL(包括过程,函数,包,触发器,匿名块和JAVA类),包括以下组件:语句文本,哈希值,P-CODE,相关的统计,执行计划;
• 与库缓存相关的动态性能视图如下表:
视图名 描述
V$SQL 缓存SQL的统计(IO,内存等),是根椐SQL文本和执行计划来分组的
V$SQLAREA 缓存SQL的统计(IO,内存等),是根椐SQL文本来分组的
V$SQLTEXT 缓存SQL的完整文本,可能包括多行
V$SQL_PLAN 缓存SQL执行计划的详细内容,相同的SQL文本可能有不同的执行计划
Data Dictionary Cache (数据字典缓存)
• 在处理SQL或PL/SQL语句时,系统要检查数据字典以确定需要的表是否存在,栏位名与数据类型是否正确,用户是否有足够的权限,这部分数据缓存在共享池的数据字典缓存中,这块内存区域同样用LRU算法来管理;
• Oracle将数据字典缓存与库缓存分开的原因是:
Ø 用与库缓存独立的LRU算法来管理字典数据,可以使得这部分数据在内存中保持更长的时间;
Ø 后续用户发出与以前用户类似的语句时,也能在数据字典缓存中找到需要的数据。
User Global Area (用户全局域)
• 只有在共享服务器选项下,共享池中才存在UGA;
• UGA用来缓存会话信息(在共享服务器选项下,一个会话的多条SQL或者PL/SQL语往往是由不同的服务器进程来完成的,因此有必要将会话信息存放在共享的位置;在专用服务器配置下,用户会话信息存放在PGA中)。