• 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

  • 相关阅读:
    javascript小白学习指南1---0
    C++学习笔记11-面向对象2
    cocos2d-x 3.0正式版 vs2013配置
    awk命令拷屏
    java实现第四届蓝桥杯空白格式化
    java实现第四届蓝桥杯空白格式化
    java实现第四届蓝桥杯空白格式化
    java实现第四届蓝桥杯空白格式化
    java实现第四届蓝桥杯空白格式化
    java实现第四届蓝桥杯危险系数
  • 原文地址:https://www.cnblogs.com/halberd-lee/p/12046478.html
Copyright © 2020-2023  润新知