oracle共享池

共享池是最复杂的SGA结构。它分为许多子结构,这些子结构由oracle服务器内部管理。共享池中的所有结构都是自动管理的。在共享池的总体大小范围内,各个结构的大小将因针对实例的活动模式而异。根据DBA的指令或以自动管理方式,共享池本身的大小可以动态协调。

1.库缓存

库缓存是内存区域,按其已分析的内存格式存储最近执行的代码。分析就是将编程人员编写的代码转换为可执行的代码,这是oracle根据需要执行的一个过程 。通过将代码缓存在共享池,可以在不重新分析的情况下重用,极大的提高性能。分析SQL代码会占用一些时间。考虑一个简单的SQL语句:
select *  from products where product_id=100;
在执行此语句之前,oracle服务器必须计算出它的含义及执行方法。首先什么是products?这是一个表,它是一个同义词还是一个视图?它是否存在?再来看“*”,如果products是表,则此表包含哪些列?用户有权查看此表吗?这些问题及其他任何问题的答案只有通过查询数据字典才能找到。
在了解了语句的真实含义后,服务器必须确定如何以最佳方式执行它。product_id列上编制了索引吗?如果编制了索引,使用索引定位行快,还是扫描整个表来的更快?针对数据字典执行更多查询吗?针对用户表的一个简单的 单行查询,很可能会生成针对数据字典的很多查询,分析语句的时间比最终执行它的时间还长,共享池的库缓存的目的是以分析格式存储语句供执行。第一次发出语句时,必须在执行前进行分析,而到了第二次将可以立即执行。在设计完好的应用程序中,可能只分析一次语句,而后将其执行数百万次。这会节省大量时间。

2.数据字典缓存

数据字典缓存有时成为“行缓存”。它存储最近使用的对象定义:表、索引、用户和其他元数据定义的描述。通过此类定义放在SGA的内存中,以便使所有会话可以直接访问它们,而不是被迫从磁盘上的数据字典中重复读取它们,从而提高分析性能。
数据字典缓存存储对象定义,因此当真的需要分析语句时,可以更快的执行分析,而不需要查询数据字典。考虑一下,在连续发出这些语句时,会发生什么事情:
select sum(order_amount) from orders;
select * from orders where order_no=100;
这两个语句都必须进行分析,因为它们是不同的语句,但通过分析第一个select语句,针对orders表及其列的定义将加载到数据字典缓存中,因此,第二个语句的分析速度将因此加快,因为不再需要访问数据字典。

3.PL/SQL区

存储的PL/SQL对象是过程、函数、打包的过程、打包的函数、对象类型定义和触发器。它们全都像源代码那样存储在数据字典中,也使用已编译的格式。当会话调用存储的PL/SQL对象时,它必须从数据字典读取。为了避免重复读取,将对象缓存到共享池的PL/SQL区。
第一次使用PL/SQL对象时,必须从磁盘上的数据字典表执行读取,但随后的调用将快得多,因为已经可以在共享池的PL/SQL区使用相应的对象。
提示:PL/SQL可以从用户进程发出,而不存储在数据字典中。这称为匿名PL/SQL。匿名PL/SQL不能被缓存和重用,但必须动态编译。与存储的PL/SQL相比,其性能表现始终较差。应该鼓励开发人员将所有匿名PL/SQL转换为存储的PL/SQL。

4.SQL查询和PL/SQL函数结果缓存

在很多应用程序中,同一个查询将由同一个会话或多个不同的会话执行多次。通过创建结果缓存,oracle服务器可以将此类查询的结果存储在内存中。在下次发出查询时,服务器可以检查缓存结果,而不是运行该查询。
结果缓存机制具有足够的智能,跟踪查询运行所针对的表是否发生了更新。如果有了更新,则查询结果将失效,并发出下一次查询,重新运行查询。因此,不存在接收到过时缓存结果的风险。
PL/SQL结果缓存使用类似的机制。在执行PL/SQL 函数时,可以缓存其返回值供函数下次执行时使用。如果传递给函数的参数或函数查询的表发生了变化,那么将重新计算函数,否则,将返回缓存值。
默认方式下,将禁用SQL查询和PL/SQL函数结果缓存,但如果以编程方式将其启用,那么可以极大的提高性能。此缓存位于共享池中:与前面描述的其他内存区域不同,它赋予了DBA一定程度的控制能力--DBA可以指定其最大容量。

5.设置共享池的大小

设置共享池的大小将对性能产生重要影响。它应该足够大,以便缓存所有频繁执行的代码和频繁访问的对象定义(在库缓存和数据字典缓存中),但也不能过大,以至于连仅执行一次的语句也要缓存。如果共享池过小,则性能将下降,因为服务器会话将反复抢夺其中的空间来分析语句,此后,这些语句会被其他语句重写,在重新执行时,将不得不再次分析。过大的共享池也会对性能产生不良影响,因为搜索的时间过长。如果共享池小于最优容量,则性能将下降。但有一个最小容量,如果低于此限度,则语句将失败。
共享池中的内存将按照LRU(最近最少使用least recently used)算法来分配。如果oracle服务器需要共享池中的空间,它将重写闲置时间最长的对象。如果再次需要相应的对象,将不得不重新加载,重新加载可能重写另一个对象。
提示:确定最优容量是一个性能调整问题,但可以这样讲:大多数数据库都需要一个数百MB的共享池。有些应用程序需要1GB以上的共享池,但很少有应用程序能够在共享池小于100M时充分运行。
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值