Oracle序列缓存老化过于频繁

时间:2011-02-16 11:43:21

标签: asp.net oracle sequences

我的asp.net应用程序使用一些序列来生成表主键。 Db管理员已将缓存大小设置为20.现在,应用程序正在测试中,并且每天添加一些记录(例如,每个用户测试会话为4个)。 我发现新的测试会话记录总是使用新的缓存部分,好像前一天缓存的数字已过期,每天丢失十分之一的密钥。我想知道是否由于我在我的申请中可能犯的一些错误(处理tableadapters或其他任何东西)或者它是否是通常的行为。处理oracle序列时需要考虑编程最佳实践吗?

由于应用程序不必承担繁重的工作(例如每天20-40个新记录),如果设置较小的缓存大小或根本不设置缓存大小,我就会陷入困境。 序列缓存大小调整是否意味着重置当前索引?

提前感谢您提出任何提示

4 个答案:

答案 0 :(得分:7)

Justin Cave在这篇帖子中的回答可能对你很有意思:

http://forums.oracle.com/forums/thread.jspa?threadID=640623

简而言之:如果序列的访问频率不够高,但是库缓存中有很多“流量”,则序列可能会老化并从缓存中删除。在这种情况下,预先分配的值将丢失。

如果您经常发生这种情况,那么您的序列似乎不会经常使用。

我想减少缓存大小(或完全禁用它)不会对您的案例中的性能产生显着影响(同样考虑到每天20-40条新记录的声明) )

答案 1 :(得分:2)

Oracle Sequences不是无差距的。减小缓存大小将缩小差距......但您仍然会有差距。 该序列不是由数据库与表关联,而是由您的代码(通过insert / sql / pkg api插入的nextval) - 在该注释上,您可以在多个表上使用相同的序列(它不是sql server的标识,它与列/表相关联)

因此改变序列对索引没有影响。

您只需要确保是否删除序列并重新启动它,然后''重新设置'到当前值的+1(例如,创建序列序列以125 nocache开始;)

,但是

  

如果您的申请需要   没有差距的数字,那么你   不能使用Oracle序列。你必须   序列化数据库中的活动   使用您自己开发的代码。

但要预先警告,如果您选择不使用序列,则可能会增加磁盘IO和可能的事务锁定。

  

序列生成器很有用   用于生成的多用户环境   没有开销的唯一数字   磁盘I / O或事务锁定。

重申a_horse_with_no_name的评论,id中的差距有什么问题?


修改 还可以看看你应该使用的缓存逻辑: http://download.oracle.com/docs/cd/E11882_01/server.112/e17120/views002.htm#i1007824


答案 2 :(得分:1)

如果您正在使用PK序列而不强制执行某些应用程序逻辑,那么您不必担心间隙。但是,如果某些应用程序逻辑与顺序序列值相关联,则在使用序列缓存且没有繁忙系统时会出现漏洞。序列高速缓存值可以从库高速缓存中老化。

您说您的系统不是很忙,在这种情况下将您的序列更改为无缓存。您可以在性能损失微不足道的情况下修复逻辑问题,以便您也可以这样做。

答案 3 :(得分:0)

正如人们所提到的:差距不应该是一个问题,所以如果你要求没有差距你就是做错了。 (但我认为这不是你想要的)。

减少缓存应减少数量并降低序列的性能,尤其是在并发访问时。 (在您的用例中不应该出现问题)。

使用alter sequence语句(http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_2011.htm)更改序列不应重置序列的当前/下一个val。