5

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

由于应用程序不必承担繁重的工作(例如每天 20-40 条新记录),我正在考虑是否可以设置更小的缓存大小或根本不设置。序列缓存调整大小是否意味着重置当前索引?

提前感谢您的任何提示

4

4 回答 4

7

Justin Cave 在此线程中的答案可能对您来说很有趣:

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

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

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

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

于 2011-02-16T13:39:55.070 回答
2

Oracle 序列不是无间隙的。减少缓存大小将减少差距......但你仍然会有差距。该序列不是通过数据库与表相关联,而是通过您的代码(通过触发器/sql/pkg api 插入的 nextval ) - 在该注释中,您可以在多个表上使用相同的序列(它不像sql server 与列/表关联的身份)

因此更改顺序不会对索引产生影响。

您只需要确保如果您删除序列并重新启动它,您将“重新播种”到当前值的 +1(例如,创建序列 seqer start with 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


于 2011-02-16T13:03:08.253 回答
1

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

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

于 2011-02-16T20:56:44.757 回答
0

正如人们所提到的:间隙不应该是一个问题,所以如果你不需要间隙,那么你做错了什么。(但我认为这不是你想要的)。

减少缓存应该会减少数量并降低序列的性能,尤其是在并发访问它的情况下。(这在您的用例中应该不是问题)。

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

于 2011-02-16T13:23:18.687 回答