oracle18c默认sid,Oracle 18c-可伸缩序列(Scalable Sequence)

1.

说明

在18c之前的版本中对于序列的使用,存在着对同一个序列争用的情况,特别是对于RAC这种高并发的环境中争用序列情况更是容易发生。针对这种情况,Oracle退出了可伸缩序列,大大减少了序列和所在索引的争用,并提供了更好的数据负载可伸缩性。而对于单实例也同样有用。

2.

创建可伸缩序列

l

语法

通过加SCALE关键字就可以创建可伸缩序列

CREATE | ALTER SEQUENCE sequence_name

...

https://www.cndba.cn/Expect-le/article/2922

SCALE [EXTEND | NOEXTEND] | NOSCALE

...

可伸缩序列=6位可伸缩序列偏移量数+正常的序列

6位可伸缩序列偏移量数=[(instance id % 100) + 100]+[会话ID % 1000]https://www.cndba.cn/Expect-le/article/2922

l

EXTEND

表示序列总长度=[X个数字+Y个数字],X默认值是6位数,Y是MAXVALUE指定的位数。

l

NOEXTEND

表示序列总长度不能超过MAXVALUE定义的长度,由于前面默认是6位数+正常的序列号,所以长度最少是7位数。

2.1.

实验

2.1.1.

创建EXTEND类型的可伸缩序列

l

查看会话ID和实例号

SQL> select sys_context('userenv','sid') from dual;

SYS_CONTEXT('USERENV','SID')

--------------------------------------------------------------------------------

69

https://www.cndba.cn/Expect-le/article/2922

SQL> select instance_number from v$instance;

INSTANCE_NUMBER

---------------

1

l

创建序列

SQL> create sequence lei_seq start with 1 increment by 1 minvalue 1 maxvalue 100 scale extend;https://www.cndba.cn/Expect-le/article/2922

Sequence created.

l

查看序列值

SQL> select lei_seq.nextval from dual;

NEXTVAL

101069001= 101+069+001

l

再开一个会话查看序列值

会话ID不同,生成的序列肯定不会相同,但是最后3位是依次增长的。

SQL>  select sys_context('userenv','sid') from dual;

SYS_CONTEXT('USERENV','SID')

--------------------------------------------------------------------------------

101

SQL> select lei_seq.nextval from dual;

https://www.cndba.cn/Expect-le/article/2922

NEXTVAL

----------

101101002

2.1.2.

创建NOEXTEND类型的可伸缩序列

SQL> create sequence lei_seq2 start with 1 increment by 1 minvalue 1 maxvalue 100 scale noextend;

Sequence created.

SQL> select lei_seq2.nextval from dual;https://www.cndba.cn/Expect-le/article/2922

select lei_seq2.nextval from dual

*

ERROR at line 1:

ORA-64603: NEXTVAL cannot be instantiated for LEI_SEQ2. Widen the sequence by 4

digits or alter sequence with SCALE EXTEND.

可以看到报错了序列无法实例化,提示要么去掉maxvalue参数,要么使用extend。

错误原因很简单,因为noextend的可伸缩序列最少要7位数。

修改可以修改maxvalue为1000000即可,也就是6位数+1,一直增长到9就无法增长了,因为增长到10就会超过7位数。证明如下:

SQL> alter sequence lei_seq2 maxvalue 1000000;

Sequence altered.

重复执行几次

SQL> select lei_seq2.nextval from dual;https://www.cndba.cn/Expect-le/article/2922

NEXTVAL

----------

1011011

SQL> /

NEXTVAL

----------

1011018

https://www.cndba.cn/Expect-le/article/2922

SQL> /

NEXTVAL

----------

1011019

SQL> /

select lei_seq2.nextval from dual

*

ERROR at line 1:--可以看到超过9就报错了,因为序列总长度超过了7位。

ORA-64603: NEXTVAL cannot be instantiated for LEI_SEQ2. Widen the sequence by 1

digits or alter sequence with SCALE EXTEND.

https://www.cndba.cn/Expect-le/article/2922

3.

总结

对于可伸缩序列来说EXTEND和NOEXTEND没有本质区别,MAXVALUE代表的含义有所不同。

l

对于EXTEND来说MAXVALUE代表的后面正常序列的长度,而不是可伸缩序列的总长度。

l

对于NOEXTED来说MAXVALUE代表的是可伸缩序列的总长度。

注:Oracle建议对于可伸缩序列不要使用排序,因为它本身就是无序的。

参考连接:

版权声明:本文为博主原创文章,未经博主允许不得转载。

Scalable Sequences

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值