序列缓存和性能

时间:2014-06-19 04:35:21

标签: oracle database-performance

我可以看到DBA团队建议在性能优化时将序列缓存设置为更高的值。要将值从20增加到1000或5000. oracle docs表示缓存值,

Specify how many values of the sequence the database preallocates and keeps in memory for faster access.

在AWR报告的某处,我可以看到,

select SEQ_MY_SEQU_EMP_ID.nextval from dual

如果我增加SEQ_MY_SEQU_EMP_ID的缓存值,是否可以看到任何性能改进。

我的问题是:

序列缓存是否在性能方面发挥了重要作用?如果是这样,如何知道序列所需的足够高速缓存值。

5 个答案:

答案 0 :(得分:7)

我们可以在用完之前从oracle缓存中获取序列值。当所有这些都被使用时,oracle将分配一批新值和更新oracle数据字典。 如果你有100000条记录需要插入并设置缓存大小为20,oracle将更新数据字典5000次,但如果你将5000设置为缓存大小则只有20次。

更多信息可能会帮助您:http://support.esri.com/en/knowledgebase/techarticles/detail/20498

答案 1 :(得分:7)

如果省略CACHE和NOCACHE,则默认情况下数据库会缓存20个序列号。如果您在Oracle Real Application Clusters环境中使用序列,Oracle建议使用CACHE设置来增强性能。

同时使用CACHE和NOORDER选项可以获得序列的最佳性能。在没有ORDER选项的情况下使用CACHE选项,每个实例都缓存一个单独的数字范围,并且可以由不同的实例无序地分配序列号。因此,CACHE的值越少写入字典,但可能会丢失更多的序列号。但是没有必要担心失去这些数字,因为回滚,关闭肯定会“失去”一个数字。

CACHE选项使每个实例缓存其自己的数字范围,从而减少对Oracle数据字典的I / O,并且NOORDER选项消除了互连上的消息流量,以协调跨数据库的所有实例的数字顺序分配。 NOCACHE将会很慢......

阅读this

答案 2 :(得分:1)

默认情况下,ORACLE缓存中包含20个值。我们可以通过序列定义中的给定缓存子句重新定义它。按顺序给缓存caluse有利于当我们想要生成大整数然后它比正常时间花费更少的时间,否则通过在序列定义中声明缓存子句没有如此剧烈的性能增加。

答案 3 :(得分:0)

做了一些研究,并在这方面找到了一些相关信息:

  • 我们需要检查数据库中是否有高使用率但是默认缓存大小为20的序列 - 性能 改变这种序列的高速缓存大小的好处可以是 引人注目。
  • 增加序列的缓存大小不会浪费空间 缓存仍由两个数字定义,最后一个使用和 高水位;只是高水位被一个跳跃 每次到达时都会有更大的价值。
  • 缓存序列将返回与非缓存完全相同的值 一。但是,序列缓存仍保留在共享池中 其他缓存的信息是。这意味着它可以超出共享范围 如果不经常访问过程,则以与过程相同的方式进行池化 足够。一切都是实例时缓存也丢失了 关闭。

答案 4 :(得分:0)

除了花费更多时间更新oracle数据字典,如果使用Clustered Oracle安装,那么具有小序列缓存的字典可能会产生其他负面影响。

在Murali Vallath的Oracle 10g RAC网格,服务和集群第1版中,声明如果你碰巧有

  • Oracle Cluster(RAC)
  • 填充了递增序列值的列上的非分区索引
  • 并发多实例插入

您可能会在最右边的索引块上发生高争用,并且会遇到大量群集等待(最多占总插入时间的90%)。 如果增加相关序列缓存的大小,则可以减少群集等待对索引的影响。

an excerpt from the mentioned book