关于oracle序列的问题

kaixinmengya 2010-02-08 10:11:13
我创建了一个序列,比如seq_no,我初始值设置的是1,增量是1,缓冲是2。
我希望的是这个序列能一直从1往上增加,1、2、3、4等等。但是我发现有的时候会出现中间的序列号断开的情况,比如1完了之后,下次就到3了,2没有。我在产生1之后,重新启动过数据库,不知道是否和这个有关呢?虽然少一两个序列值影响不大,但是还是希望有什么办法能够让序列值自动连续下来,不丢失最好。
请问大家有什么好的办法吗?谢谢了先~
...全文
174 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
vber1010 2010-02-08
  • 打赏
  • 举报
回复
原来有这回事 一直没在意过
ACMAIN_CHM 2010-02-08
  • 打赏
  • 举报
回复
不一定和重启有关,有时你可以seq.nextvalue 但并示使用这个号码,也会导致跳号。
suiziguo 2010-02-08
  • 打赏
  • 举报
回复
NOCACHE肯定有性能影响。

如果不是多实例集群环境,可以考虑。但ORACLE强烈推荐cache之。

另外,只要存在rollback可能,序列号就会不连续。

冒昧多说句:触发器不是好办法。

不用序列,可以新建一张表,记录业务表中现有最大序号。当业务插入数据提交时,同时每次更新配置表的最大ID。写在一个事务中,这样,回滚时,业务表未插入数据的话,配置表也不会被更新。当然,这样对维护和性能也有影响,呵呵。

仅供参考。
kaixinmengya 2010-02-08
  • 打赏
  • 举报
回复
呵呵,原来是这么回事啊。nocache是不是就是把缓冲设置为0啊?这样的话我想序列应该是能连续起来了,只是不用缓冲的话是不是对性能会有一定影响呢?当然我现在对性能还没有什么要求,因为并不是有多大的数据并发执行的。
to java3344520:我刚接触数据库不久,懂的只是还不多,还不了解什么是触发器啊?⊙﹏⊙b汗,我得赶快学学其他的知识了。呵呵
luhui436 2010-02-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 siakang 的回复:]
如果指定CACHE值,oracle就可以预先在内存里面放置一些sequence,这样存取的快些。
cache里面的取完后,oracle自动再取一组到cache。
使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。
[/Quote]
学习
iqlife 2010-02-08
  • 打赏
  • 举报
回复
序列不能满足你要求的话,用触发器吧
siakang 2010-02-08
  • 打赏
  • 举报
回复
如果指定CACHE值,oracle就可以预先在内存里面放置一些sequence,这样存取的快些。
cache里面的取完后,oracle自动再取一组到cache。
使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。
yuzhenhuan01 2010-02-08
  • 打赏
  • 举报
回复
还有这种说法啊
学习了
suiziguo 2010-02-08
  • 打赏
  • 举报
回复
是的,和你重启数据库有关。

重启时CACHE的序列号会丢失。


另外,回滚也会导致序列号不连续。

这两种序列机制本身无法解决,呵呵。

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧