序列缓存和性能

Posted

技术标签:

【中文标题】序列缓存和性能【英文标题】:Sequence cache and performance 【发布时间】:2014-08-09 12:50:35 【问题描述】:

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

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 的缓存值,是否可以看到任何性能提升。

我的问题是:

序列缓存对性能有什么重要作用吗?如果是,如何知道序列所需的足够缓存值是多少。

【问题讨论】:

每秒请求下一个序列值多少次?你怎么知道SEQ_MY_SEQU_EMP_ID.nextval 是瓶颈? 选中后,AWR 报告的SQL ordered by Executions 似乎占 CPU 使用率的 78.2%。 好的,绝对值是多少? 如何获得?我可以看到序列缓存等待= 5778 【参考方案1】:

默认情况下,ORACLE 缓存中的序列包含 20 个值。我们可以通过序列定义中给定的缓存子句重新定义它。按顺序提供缓存的好处是,当我们想要生成大整数时,它需要的时间比正常情况要少,否则通过在序列定义中声明缓存子句不会有如此巨大的性能提升。

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

做了一些研究,发现了这方面的一些相关资料:

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

【讨论】:

【参考方案4】:

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

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

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

阅读this

【讨论】:

【参考方案5】:

如果您使用集群式 Oracle 安装,除了花费更多时间更新具有小序列缓存的 Oracle 数据字典外,还会产生其他负面影响。

Murali Vallath 在 Oracle 10g RAC Grid, Services and Clustering 1st Edition 中指出,如果您碰巧有

Oracle 集群 (RAC) 使用递增序列值填充的列上的非分区索引 并发多实例插入

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

【讨论】:

以上是关于序列缓存和性能的主要内容,如果未能解决你的问题,请参考以下文章

Json.NET 是不是缓存类型的序列化信息?

使用springboot cache + redis缓存时使用gzip压缩以提升性能

如何优化 Django REST Framework 的性能

缓存的一些理解

常用缓存系统使用经验总结

序列图:与资源的交互(DB,网络,缓存等)