Oracle序列缓存

Mel*_*vin 8 database oracle oracle10g

我正在尝试在Oracle数据库中实现一个序列,以充当表的代理键创建者.出于性能原因,我希望缓存此序列.我已经读过使用缓存序列时存在潜在的缺陷,因为回滚和实例失败会导致错过值.

这让我思考.假设我创建了一个缓存大小为100的序列.然后我将50条记录插入到我的表中,序列值作为主要代理键.提交后,序列的当前值尚未写入磁盘.假设我此时有一个实例失败.当数据库恢复时,我理解当前序列值将重置为写入磁盘的最后一个值.

如果我要尝试在我的表中插入另外50条记录,我现在是否会破坏主键约束,因为序列已从磁盘重置为其最后一个状态,主键现在正在被重用?如果是这种情况,我该如何防止这种情况?

Pet*_*ang 15

不,情况并非如此.

您的序列将继续101,之间的值,50并且100将丢失.

禁用序列缓存的唯一原因是尝试避免序列中的间隙,这与大多数主键无关.

您可能对本文有兴趣,该文章指出了这一点

使用缓存创建序列的缺点是,如果发生系统故障,所有未使用的缓存序列值将"丢失".这导致分配的序列值中的"间隙".当系统重新启动时,Oracle将从序列中停止的位置缓存新数字,忽略所谓的"丢失"序列值.

  • 我不相信你可以保证序列中没有间隙.http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:530735152441 (6认同)
  • 我不同意这句话.声明具有丢失值的缓存的序列是"缺点"是缺少该点并且可能具有误导性 - 即使没有缓存,您也可以(并且将)仍然丢失值.主要观点必须是,您不能使用序列来保证没有间隙. (3认同)