当前位置: 首页> 文旅> 旅游 > Oracle Sequence使用总结

Oracle Sequence使用总结

时间:2025/7/11 18:57:48来源:https://blog.csdn.net/zxrhhm/article/details/139976179 浏览次数:0次

Oracle Sequence使用总结如下:

一、定义与特点

Oracle Sequence是Oracle数据库中用于生成唯一数值的数据库对象。它常被用于为表中的记录自动产生唯一序号,如主键值,以标识记录的唯一性。其主要特点包括:

  • 由用户创建并可以被多个用户共享。
  • 允许同时生成多个序列号,且每一个序列号是唯一的。
  • 典型应用是生成主键值。
  • 使用缓存可以加速序列的访问速度。

二、创建序列

创建序列的语法如下:

CREATE SEQUENCE [schema.]sequence  
[  INCREMENT BY integer |  START WITH integer |  { MAXVALUE integer | NOMAXVALUE } |  { MINVALUE integer | NOMINVALUE } |  { CYCLE | NOCYCLE } |  { CACHE integer | NOCACHE } |  { ORDER | NOORDER }  
]  
...

其中:

  • INCREMENT BY:设置相邻两个元素之间的差值,默认为1。
  • START WITH:设置序列初始值,默认值为1。
  • MAXVALUE 和 MINVALUE:设置序列的最大值和最小值。默认情况下,递增序列的最大值为1028 - 1,最小值为1;递减序列的最大值为-1,最小值为-(1027 - 1)。
  • CYCLE 和 NOCYCLE:决定当序列值达到其最大值或最小值时是否循环。如果循环,则当递增序列达到最大值时,循环到最小值;对于递减序列达到最小值时,循环到最大值。如果不循环,达到限制值后,继续产生新值会发生错误。
  • CACHE 和 NOCACHE:决定是否在内存中预先放置一些序列值以加速访问。使用CACHE可能会因系统故障导致未使用的缓存序列值丢失。

示例
CREATE SEQUENCE seq_t_testemp INCREMENT BY -1 MINVALUE 1 MAXVALUE 999999999999 START WITH -1 CACHE 100 ORDER;

[oracle@orcl23c ~]$ sqlplus / as sysdbaSQL*Plus: Release 23.0.0.0.0 - Production on Tue Jun 25 09:13:28 2024
Version 23.4.0.24.05Copyright (c) 1982, 2024, Oracle.  All rights reserved.Connected to an idle instance.TESTUSER@FREEPDB1> CREATE SEQUENCE seq_t_testemp INCREMENT BY 1 MINVALUE 1 MAXVALUE 999999999999 START WITH 1 CACHE 100 ORDER;Sequence created.TESTUSER@FREEPDB1> select seq_t_testemp.nextval from dual;NEXTVAL
----------1TESTUSER@FREEPDB1> select seq_t_testemp.nextval;NEXTVAL
----------2-- 查询当前序列的值
TESTUSER@FREEPDB1> select seq_t_testemp.currval;CURRVAL
----------2TESTUSER@FREEPDB1> select seq_t_testemp.currval from dual;CURRVAL
----------2

三、使用序列

序列具有CURRVAL和NEXTVAL两个伪列。CURRVAL返回当前序列的值,但在第一次使用NEXTVAL初始化之后才能使用,否则会出错。NEXTVAL返回序列的下一个值,并自动增加定义的INCREMENT BY值。

可以在SELECT语句、INSERT语句、UPDATE语句等中使用序列。例如:

INSERT INTO t_testemp VALUES (seq_t_testemp .nextval, 'super', 'seqtest', 8765, SYSDATE, 32000, NULL, 30);  SELECT seq_t_testemp.currval FROM DUAL;

四、注意事项

  • 如果指定了CACHE值,Oracle会预先在内存中放置一些序列值。当cache中的值取完后,Oracle会自动再取一组到cache。但如果数据库突然不正常关闭(如使用shutdown abort),cache中的序列值可能会丢失,导致跳号。

  • 在使用NEXTVAL时,不能直接在SELECT语句后跟具体的表名,否则可能会导致序列值设置错误。应该使用FROM DUAL来查询。

  • 如果事务中途失败,使用Sequence生成的主键值可能会导致数据重复或不一致。因此,在使用时需要注意事务的完整性和错误处理。

  • 如果是RAC集群,确保sequence不出现跳号现象是一个重要考虑因素,通过合理配置sequence的CACHE和NOCACHE属性、使用KEEP CACHE选项、仔细创建和修改sequence以及定期监控和维护,可以有效减少或避免sequence的跳号现象。

五、sequence 在RAC环境

在Oracle的RAC(Real Application Clusters)环境中,确保sequence不出现跳号现象是一个重要考虑因素。以下是关于如何在RAC环境中配置Oracle sequence以减少或避免跳号的一些建议和措施:

  1. 序列的CACHE和NOCACHE属性

    • CACHE属性:当为sequence指定CACHE属性时,Oracle会预先生成并缓存一组序列号在内存中。这可以提高获取新序列号的效率。然而,在某些情况下(如数据库实例崩溃、sequence缓存被清除等),可能会导致跳号现象。
      • CACHE+NOORDER:这是RAC环境下的推荐配置。在不指定order属性的情况下,RAC默认使用此配置,并且cache的默认值通常为20。对于频繁使用的sequence,建议将cache值调整为1000~2000。
      • CACHE+ORDER:如果应用要求sequence具有严格的顺序性,则需要设置order属性。但请注意,即使设置了order属性,sequence也可能在特定情况下(如flush、instance shutdown等)出现跳号。
    • NOCACHE属性:不预先在内存中生成序列号。虽然这可以避免由CACHE引起的跳号问题,但会降低获取新序列号的效率。
  2. 序列的KEEP CACHE选项

    • 使用DBMS_SHARED_POOL.KEEP过程将sequence的cache保持在shared pool中,以防止其因LRU(最近最少使用)算法而被清除,从而减少跳号的可能性。
  3. 序列的创建和修改

    • 在创建sequence时,应仔细考虑其START WITH、INCREMENT BY、MAXVALUE、MINVALUE、CYCLE/NOCYCLE等属性,以确保其满足应用需求。
    • 使用ALTER SEQUENCE语句可以修改已存在的sequence的属性(但注意不能修改初始值)。
  4. 监控和维护

    • 定期监控sequence的使用情况和跳号现象,以便及时发现并解决问题。
    • 在进行数据库维护操作(如备份、恢复、升级等)时,应特别注意对sequence的影响,并采取适当的措施来避免跳号。

总结
在Oracle的RAC环境中,通过合理配置sequence的CACHE和NOCACHE属性、使用KEEP CACHE选项、仔细创建和修改sequence以及定期监控和维护,可以有效减少或避免sequence的跳号现象。同时,应注意根据应用的实际需求来选择合适的配置和策略。

六、dba_sequences(all_sequences)视图

在这里插入代码片

官方描述
ALL_SEQUENCES describes all sequences accessible to the current user.
Related Views

  • DBA_SEQUENCES
  • USER_SEQUENCES
select * from all_sequences where sequence_name=upper('seq_t_testemp');SQL> desc all_sequences;
Name           Type          Nullable Default Comments                                                                             
-------------- ------------- -------- ------- ------------------------------------------------------------------------------------ 
SEQUENCE_OWNER VARCHAR2(128)                  Name of the owner of the sequence                                                    
SEQUENCE_NAME  VARCHAR2(128)                  SEQUENCE name                                                                        
MIN_VALUE      NUMBER        Y                Minimum value of the sequence                                                        
MAX_VALUE      NUMBER        Y                Maximum value of the sequence                                                        
INCREMENT_BY   NUMBER                         Value by which sequence is incremented                                               
CYCLE_FLAG     VARCHAR2(1)   Y                Does sequence wrap around on reaching limit?                                         
ORDER_FLAG     VARCHAR2(1)   Y                Are sequence numbers generated in order?                                             
CACHE_SIZE     NUMBER                         Number of sequence numbers to cache                                                  
LAST_NUMBER    NUMBER                         Last sequence number written to disk                                                 
SCALE_FLAG     VARCHAR2(1)   Y                Is this a scalable sequence?                                                         
EXTEND_FLAG    VARCHAR2(1)   Y                Does this scalable sequence's generated values extend beyond max_value or min_value? 
SHARDED_FLAG   VARCHAR2(1)   Y                Is this a sharded sequence?                                                          
SESSION_FLAG   VARCHAR2(1)   Y                Is this a session sequence?                                                          
KEEP_VALUE     VARCHAR2(1)   Y                Are sequence values kept during replay after failure      
关键字:Oracle Sequence使用总结

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: