当前位置: 首页 > news >正文

oracle数据库sequence的作用

sequence概念及作用

sequence是用来在多用户环境下产生唯一整数的数据库对象。序列产生器顺序生成数字,它可用于自动生成主键值,并能协调多行或者多表的主键操 作。没有sequence,顺序的值只能靠编写程序来生成。先找出最近产生的值然后自增长。这种方法要求一个事务级别的锁,这将导致在多用户并发操作的环 境下,必须有人等待下一个主键值的产生。而且此方法很容易产生主键冲突的错误,如下图:

如上图,事务2会报主键冲突的错误,而再刷新一下页面(再执行一边程序),可能就正常了。 还有一个问题,那就是完成生成主键的程序 (一般情况包含plsql块)本身对于并发调用也是一个瓶颈,因为这样的程序段往往是提供给好多程序去调用,如果代码端写的不够优化(比如没有使用邦定变 量等等),或者此代码段存在问题,那么它所影响的是系统的全局。我们应该提倡开发人员使用sequence。sequence消除了序列化问题,而且改善 了应用的并发能力。

创建sequence

sequence的命名最重要的是要统一,命名规则是次要的。 CREATE SEQUENCE emp_sequence INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE CACHE 10; 这 里需要重点说明的是cache参数,它是为了应对并发访问的。cache参数告诉oracle预先分配一个sequence numbers的集合,并且保留在内存中,以便sequence number能够被快速的访问。这个内存的大小就是cache所指定的大小,当多个用户同时访问一个sequence的时候,是在oracle SGA中读取sequence当前的合理数值,如果并发访问太大,cache的大小不够,那么就会产生sequence cache相关的等待(enq: SQ – contention),影响系统性能。 既然cache涉及到了内存,那么就会想到oracle实例恢复的问题。如果数据库shutdown abort,sequence会如何呢?当然会有问题,sequence number保存在内存里的但是没有被应用到表中的会丢失!

修改sequence

除了修改sequence的starting number,你什么都能改,如果想改starting number,只能先drop然后create。 ALTER SEQUENCE emp_sequence INCREMENT BY 10 MAXVALUE 10000 CYCLE CACHE 20; 修 改很有用,最典型的情况是“需要把sequence 的current value改大一点,避免程序报错!”。你就可以看看current value是多少,然后修改increment by 足够大的值,然后执行.nextval,最后别忘了再将increnent by改成原来的值,还要注意做这些工作的前提是当前没有人用此sequence。

注意:sequence与表没有关系,我们在使用的时候可以通过如下形式为每张表创建对应的sequence:seq_tablename.

使用 sequence

CURRVAL 和 NEXTVAL 能够在以下情况使用: insert的values字句、select中的select列表、update中的set字句

CURRVAL 和 NEXTVAL 不能够在以下情况使用: 子查询、视图和实体化视图的查询、带distinct的select语句、带 group by和order by的select语句、带union或intersect或minus的select语句、select中的where字句、create table与alter table中的default值、check约束条件。

删除sequence

drop sequence seq_a; 当删除sequence后,对应它的同义词会被保留,但是引用时会报错。

oracle rac环境中的sequence

oracle为了在rac环境下为了sequence的一致性,使用了三种锁:row cache lock、SQ锁、SV锁。 row cache lock的目的是在sequence指定nocache的情况下调用sequence.nextval过程中保证序列的顺序性; SQ锁是应用于指定了cache+noorder的情况下调用sequence.nextval过程中。 SV 锁(dfs lock handel) 是调用sequence.nextval期间拥有的锁。前提是创建sequence时指定了cache 和order属性 (cache+order)。order参数的目的是为了在RAC上节点之间生成sequence的顺序得到保障。

创建sequence赋予的cache值较小时,有enq:sq-contention等待增加的趋势。 cache的缺省值是20.因此创建并发访问多的sequence时,cacheh值应取大一些。否则会发生enq:sq-contention等待事件。

rac上创建sequence时,如果指定了cache大小而赋予noorder属性,则各节点将会把不同范围的sequence值cache到内 存上。若两个节点之间都必须通过依次递增方式使用sequence,必须赋予如下的order属性(一般不需要这样做)”sql> create sequence seq_b cache 100 order”。如果是已赋予了cache+order属性的sequence,oracle使用SV锁进行同步。SV锁争用问题发生时的解决方法与sq锁 的情况相同,就是将cache 值进行适当调整。

在RAC多节点环境下,Sequence的Cache属性对性能的影响很大。应该尽量赋予cache+noorder属性,并要给予足够的 cache值。如果需要保障顺序,必须赋予cache+order属性。但这时为了保障顺序,实例之间需要不断的交换数据。因此性能稍差

 


http://www.taodudu.cc/news/show-7665463.html

相关文章:

  • Collections.singletonMap()用法
  • Java Collections.list()方法具有什么功能呢?
  • Java Collections singletonList()方法具有什么功能呢?
  • Java Collections unmodifiableSet()方法具有什么功能呢?
  • Java Collections singletonMap()方法具有什么功能呢?
  • Collections踩坑UnsupportedOperationException
  • python之collections库
  • Java Collections swap()方法具有什么功能呢?
  • Java Collections.newSetFromMap方法具有什么功能呢?
  • Collections.unmodifiableList方法
  • Collections基本用法
  • Python入门之collections模块
  • Java入门第120课——使用Collections.sort方法实现排序
  • Collections之disjoint使用
  • Python collections 模块
  • java collections 用法_Java中Collections类详细用法
  • java的collections_Java 之 Collections 工具类
  • Collections的基本用法
  • Java的Collections类
  • Collections类(笔记)
  • python中的 collections 模块(用法、详解、底层原理,示例等)
  • Collections类详解
  • grant 命令
  • mysql grant 所有权限_mysql之grant权限说明
  • mysql 取消grant_MySQL中授权(grant)和撤销授权(revoke)
  • oracle数据库grant用法,Oracle初学者之grant授权
  • pm grant 命令
  • 第四十八章 SQL命令 GRANT(二)
  • mysql grant on_Mysql权限管理grant命令使笔记
  • oracle view grant,view需要with grant option的情况