Oracle Sequence

Oracle Sequence

1 序列迁移

select 'drop sequence '||sequence_owner||'.'||sequence_name||';'||CHR(10)||
'create sequence '||sequence_owner||'.'||sequence_name  ||
' start with '||to_char(last_number+1)                  ||
' increment by '||increment_by                          ||
' minvalue '||min_value                                 ||
' MAXVALUE '|| MAX_VALUE                                ||
' cache '||decode(cache_size,0,20,cache_size)           ||
decode(cycle_flag,'N',' NOCYCLE',' CYCLE')              ||
 decode(order_flag,'N',' NOORDER',' ORDER')             ||
';'
  from dba_sequences
 where sequence_owner not in ('SYS','SYSTEM','OUTLN','TSMSYS','ORACLE_OCM','DBSNMP',
                     'SYSMAN','XDB','OLAPSYS','APEX_030200','MDSYS','ORDDATA','CTXSYS',
                     'WMSYS','DBMON','EXFSYS','HR','SCOTT','IX');

2 RAC中序列的注意事项

在创建序列的语句中有两个参数需要关注,[no]cache 和[no]order.

  • cache 的作用是在内存中缓存 N个序列值,供程序调用,而不必每次都去更新基表。
  • order 的作用是保证两个节点按顺序取值。
  • noorder 的作用是保证每个节点按照自己节点内的顺序取值。这样的话,有可能两个节点取值的顺序是混乱的。 此参数是默认值。

下面是测试结果:

2.1 cache + noorder

节点1, # 号后面的内存是我后面添加的注释。

# 创建序列,采用noorder .
SQL> create sequence sq1 start with 1 increment by 1 cache 2000 noorder;

Sequence created.

# 取出本节点的第一个序列值。
SQL> select sq1.nextval from dual;

   NEXTVAL
----------
         1
# 查看实例编号,然后去节点2查看序列的下一个值
SQL> select instance_number from v$instance;

INSTANCE_NUMBER
---------------
              1

节点2:

# 查看序列的下一个值。
SQL> select sq1.nextval from dual;

   NEXTVAL
----------
      2001
结论
RAC 环境中,每个节点会保存cache(比如示例中cache值是2000)个序列到本实例。每次取值都会从 本实例已cache的序列中取值。也就是说,每个实例都会维护自己的cache值。

2.2 cache + order

节点1示例如下:

# 删除之前创建的序列
SQL> drop sequence sq1;

Sequence dropped.
# 创建序列,cache 设置为2000,与上一次测试一致。不同的是 noorder 改为 order.
SQL> create sequence sq1 start with 1 increment by 1 cache 2000 order;

Sequence created.
# 取当前实例的序列值,然后去节点2执行相同的语句
SQL> select sq1.nextval from dual;

   NEXTVAL
----------
         1
# 查看实例编号
SQL> select instance_number from v$instance;

INSTANCE_NUMBER
---------------
              1

# 去节点2查看序列的下一个值,修改时间显示格式,
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

Session altered.
# 由于只查询序列值,无法判断两次查询的先后,所以加了查询时的时间
SQL> select sq1.nextval,sysdate from dual;

   NEXTVAL SYSDATE
---------- -------------------
         3 2019-12-15 21:48:16

节点2查询:

# 查看实例编号
SQL> select instance_number from v$instance;

INSTANCE_NUMBER
---------------
              2
# 查看序列的下一个值,此操作在节点1的第一次查询后执行。
SQL> select sq1.nextval from dual;

   NEXTVAL
----------
         2
# 查看序列的下一个值。由于此语句执行加上了时间,可以判断是在序列值为3后操作的。
SQL> select sq1.nextval,sysdate from dual;

   NEXTVAL SYSDATE
---------- -------------------
         4 2019-12-15 21:48:23

结论
order 参数可以保证RAC两个节点取序列值,是按顺序取值的,两个实例共同维护同一个cache .

Author: halberd E-mail: halberd.lee@gmail.com Tel: 18258160531

Created: 2019-12-15 Sun 22:50

Validate

原文地址:https://www.cnblogs.com/halberd-lee/p/12046478.html