我发现在假日期间出现的oracle序列中存在18个数字的间隙,并且在日志文件中没有发现此犯罪的痕迹。我能否以某种方式看到序列更新的时间或任何其他方式来追踪序列号的消失?
答案 0 :(得分:3)
正如其他答案/评论所述,序列永远不会保证无间隙。差距可以在很多方面发生。
关于序列的一个问题是它们默认为CACHE 20
。这意味着当调用NEXTVAL
时,数据库中的序列实际上增加了20,返回了值,接下来的19个值只是从内存(共享池)返回。 )
如果序列从共享池中老化,或者刷新了共享池或重新启动了数据库,则值"遗留在"在序列中,内存缓存丢失,因为下一次序列从数据库中获取值,比上一次高20。
正如你在假日期间发生的那样,我想这可能是因为你的序列使用了来自内存的2个值,然后DBA在假期中进行了维护,导致共享池刷新,剩下的18个值在序列存储器缓存消失了。
这是正常行为以及序列快速运行的原因。你可以更接近"通过NOCACHE NOORDER
实现无差距,但无论如何都会降低成本并且永远不会出现无差距。
答案 1 :(得分:2)
不保证序列产生无间隙的数字序列。它用于生成一系列(唯一)数字,这些数字在多用户环境中具有高度可扩展性。
如果您的应用程序要求表格上的某些数字标识符是连续的,没有间隙,那么您将需要另一种方法来生成这些标识符。
答案 2 :(得分:1)
默认情况下,oracle序列为NOORDER
。请参阅oracle文档https://docs.oracle.com/cd/B13789_01/server.101/b10759/statements_6014.htm。因此NOORDER
行为不能像预期的那样。您可以检查您的oracle序列是否在ORDER
中,如果没有,那么它是其他问题。