oracle序列跳号,回跳

  • 什么情况下使用cache什么时间上使用nocache?
    应该尽量使用cache,因为现在的数据库很多都是在高并发的情况下运行的,首先这样可以搞性能,并且也不会产生rowcache lock等待事件。可能有些人会担心数据库不正常的down掉会产生序列号间断,但这也是很少的情况。
    当然如果你的业务要求是绝不能产生间断的序列号,那就要使用nochache了。

单机跳号

--创建序列
CREATE SEQUENCE NYYTEST.S_TEST
    STARTWITH 1
    INCREMENTBY 1
    NOMINVALUE
    MAXVALUE 10000
    NOCYCLE
    CACHE  20
    NOORDER

-- 取值
select S_TEST.nextval from dual;--1
select S_TEST.nextval from dual;--2


--刷新共享池,清空 cache 中缓存的序列值
--刷新共享池会使所有的没有使用DBMS_SHARED_POOL.KEEP固定的对象全部被清除,所以共享池刚刚刷新的时候,SQL和PL/SQL的执行效率会略微下降
ALTER SYSTEM FLUSH SHARED_POOL;

-- 取值 会跳号
--由于cache的20个序列号已经从共享池中被清除,下次再取序列的nextval值取的是21
select S_TEST.nextval from dual;--21

集群跳号,回跳

cache会把sequence缓存在lb cache中,
序列是被共享的,两台机器cache了不同的两段seq

  1. A节点上序列缓存1-20,B节点序列缓存了21-40
  2. 第一次在A节点上请求nextval时,A将缓存值1-20并返回值1
  3. 如果负载算法是lru,下一个对nextval的请求发生在B节点上,B将缓存值21-40并返回值21 (跳号)
  4. 再下一次nextval的请求发生在A节点,此时如果A节点序列缓存没刷新,会返回值2 (回跳)

解决办法

  1. 设置cache为空
    影响性能
  2. 序列设置为order,即采用cache + order

结论

sequence 只确保ID的唯一性
只设置 cache属性 容易导致跳号
设置 order属性 会保证唯一性

SEQUENCE cache原理:

  • 设置no cache时, Oracle 直接从SEQUENCE 取下一个序列值
  • 设置cache时, cache会缓存指定个数的序列值 , Oracle 会直接从 cache 中取下一个序列值, cache 中的序列值用完了,或者被手工清空 Oracle 会再次产生指定个数序列值并放置 cache 中供使用

oracle管理序列方法: 序列等待事件

在这里插入图片描述

图片转载于 https://blog.csdn.net/cpongo3/article/details/88799102

  1. row cache lock :
    在 nocache 情况下,调用sequence.nextval过程中 保证序列的顺序性
  2. SQ锁(enq: SQ - contention) :
    (cache+noorder) 调用sequence.nextval过程中
  3. SV锁(enq: SV - contention):dfs lock handel
    cache+order情况下, RAC上节点之间顺序得到保障的的前提下,调用sequence.nextval期间拥有。
    cache+order属性 为了保障顺序,集群实例之间需要不断的交换数据。因此性能稍差。单比nocache强
SELECT *
FROM V$EVENT_NAME
WHERE NAME IN (
'row cache lock',
'enq: SQ - contention',
'DFS lock handle',
'enq: SV -  contention');

Oracle 11g R2. 单Instance数据库单会话循环不间断取值耗时测试:

序列参数耗时取值数量
nocache2.26s10000
cache:200.46s10000
cache:1000.37s10000
nocache:9.33s40000
cache:10001.31s40000
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xyc1211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值