`
zhanglu0223
  • 浏览: 21714 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

数据库性能优化3——Oracle SEQUENCE的概念、作用以及创建(使得并发插入主键唯一)

 
阅读更多

1. Oracle Sequence的概念

Oracle使用序列来生成唯一编号,而不是使用SQLServer所用的数据类型uniqueidentifier。无论是哪种情况,主要用途都是为主键列生成一系列唯一编号。与uniqueidentifier数据类型不同,序列是与将其用于主键值的一个或多个表无关的数据库对象。

Oracle序列是原子对象,并且是一致的。也就是说,一旦您访问一个序列号,Oracle将在处理下一个请求之前自动递增下一个编号,从而确保不会出现重复值。

2. Oracle Sequence的作用

sequence是用来在多用户环境下产生唯一整数的数据库对象。序列产生器顺序生成数字,它可用于自动生成主键值,并能协调多行或者多表的主键操作。没有sequence,顺序的值只能靠编写程序来生成。先找出最近产生的值然后自增长。这种方法要求一个事务级别的锁,这将导致在多用户并发操作的环境下,必须有人等待下一个主键值的产生。而且此方法很容易产生主键冲突的错误,如下图:
time a......trans1 begin.........................................................
|
取max value=5
|
time b......max value+1=6........trans2 begin.....................
| |
other actionmax value=5
| |
time c.....commit;...................max value+1=6................
|
commt(ora-00001)


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


创建sequence


sequence的命名最重要的是要统一,命名规则是次要的。可以使用CREATESEQUENCE命令创建Oracle序列。该命令所带参数包括增量、起始值、最大值、循环和缓存。可使用NEXTVAL和CURRVAL关键字访问序列值。NEXTVAL返回序列中的下一个编号,而CURRVAL提供对当前值的访问。
CREATE SEQUENCE emp_sequence
INCREMENT BY 1
START WITH 1
NOMAXVALUE
NOCYCLE
CACHE 10

NOORDER;

大多数序列代码是不言自明的。NOCYCLE表示序列在达到最小值或最大值后将不再生成其他值。NOCACHE表示序列值在被请求之前不会进行分配;可使用预分配机制来改善性能。NOORDER表示在生成编号时,不能保证按照请求编号的顺序返回这些编号(order:保证序列号按请求顺序产生.如果你想以序列号作为timestamp(时间戳)类型的话,可以采用该选项.对于将序列用于生成主键来说,一般用noorder,约定顺序通常并不重要.)
这里需要重点说明的是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


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属性。但这时为了保障顺序,实例之间需要不断的交换数据。因此性能稍差。


3. Oracle Sequence的创建

Oracle创建序列是我们最常用的操作之一,下面就为您详细介绍Oracle创建序列及查询序列的语法知识,希望对您能够有所帮助。

Oracle创建序列

create sequence seq_a minvalue 1000 maxvalue 99999999 start with 1000 increment by 1 nocache; 



查询序列

  1. selectseq_a.nextvalfromdual;

为每张表生成对应的序列

--创建存储过程

  1. createorreplaceprocedurep_createseq(tablenameinvarchar2)
  2. is
  3. strsqlvarchar2(500);
  4. begin
  5. strsql:='createsequenceseq_'||tablename||'minvalue1000maxvalue99999999startwith1000incrementby1nocache';
  6. executeimmediatestrsql;
  7. endp_createseq;
  8. /

--Oracle创建序列

  1. execp_createseq('t_power');
  2. execp_createseq('t_roler');
  3. execp_createseq('t_roler_power');
  4. execp_createseq('t_department');
  5. execp_createseq('t_quarters');
  6. execp_createseq('t_quarters_roler');
  7. execp_createseq('t_emp');
  8. execp_createseq('t_require_plan');
  9. execp_createseq('t_require_minutia');
  10. execp_createseq('t_require_audit');
  11. execp_createseq('t_engage');
  12. execp_createseq('t_home');
  13. execp_createseq('t_education');
  14. execp_createseq('t_works');
  15. execp_createseq('t_skill');
  16. execp_createseq('t_account');
  17. execp_createseq('t_licence');
  18. execp_createseq('t_title');
  19. execp_createseq('t_remove');
  20. execp_createseq('t_train');
  21. execp_createseq('t_pact');
  22. execp_createseq('t_assess');
  23. execp_createseq('t_attendance');
  24. execp_createseq('t_reward_punish');
  25. execp_createseq('t_dimission');
  26. execp_createseq('t_emp_roler');
  27. execp_createseq('t_code');



分享到:
评论

相关推荐

    oracle中的sequence实现主键增长

    教你如何使用oracle中的sequence,实现主键自动增长

    Oracle sequence 重置(失效恢复)

    在Oracle数据库移植过程中,sequence可能失效,本资源可使失效的sequence重新恢复作用

    Oracle创建自增字段方法-ORACLE SEQUENCE的简单介绍

    Oracle创建自增字段方法-ORACLE SEQUENCE的简单介绍 很有用哦

    oracle 主键自增 sequence

    oracle 主键自增 给你个例子吧:看看肯定明白了!!! 首先,你要有一张表! CREATE TABLE example( ID Number(4) NOT NULL PRIMARY KEY, NAME VARCHAR(25), PHONE VARCHAR(10), ADDRESS VARCHAR(50) ); ...

    Oracle数据库中创建自增主键的实例教程

    在设计数据库表的时候发现Oracle没有自增主键的设置,Google了解到Oracle本身并不支持自增主键,需要通过序列(Sequence)和触发器(Trigger)实现。 创建表Student Create Table Student( id number(12) primary ...

    oracle数据库主键自增并且返回主键值

    create sequence seq_users ##创建序列seq_users increment by 1 ## 步长,每次加1 start with 1 ##从1开始 minvalue 1 ##最小值 maxvalue 9999999 ##最大值 order ##确保按照请求次序生成整数 【不常用的设置】....

    oracle基础教程

    第3章 ORACLE数据库的网络应用 46 3.1 SQL*Net产品介绍 46 3.2 配置客户机/服务器结构 47 3.2.1 配置listener.ora 47 3.2.2 配置tnsnames.ora文件 48 第4章 常用任务示例 51 4.1 如何恢复被误删的数据文件 51 4.2 ...

    【动力节点】Oracle从入门到精通视频教程_数据库实战精讲

    教程名称: 【动力节点】Oracle从入门到精通视频教程_数据库实战精讲本套Java视频中讲解了Oracle数据库基础、搭建Oracle数据库环境、SQL*Plus命令行工具的使用、标准SQL、Oracle...-表空间、Oracle数据库常用对象...

    浅谈MyBatis-Plus学习之Oracle的主键Sequence设置的方法

    主要介绍了浅谈MyBatis-Plus学习之Oracle的主键Sequence设置的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    生成oracle数据库中的所有sequence的语句

    可以根据oracle数据库中存在的sequence,生成建立语句

    oracle中sequence介绍及应用

    oracle中sequence介绍及应用

    GoldenGate Oracle University 培训教材

    oracle数据库同步、备份产品: ABOUT GOLDENGATE – COMPANY AND SOLUTIONS———— 5 TECHNOLOGY OVERVIEW————18 ARCHITECTURE ———— 22 CONFIGURING ORACLE GOLDENGATE ———— 28 STEP 1 PREPARE THE ...

    分享ORACLE SEQUENCE跳号总结

    在ORACLE数据库中,序列(SEQUENCE)是使用非常频繁的一个数据库对象,但是有时候会遇到序列(SEQUECNE)跳号(skip sequence numbers)的情形,那么在哪些情形下会遇到跳号呢?  事务回滚引起的跳号  不管序列有...

    ORACLE SEQUENCE的简单介绍

    Sql Server 数据库,插入操作时可以设置,自动编号。但是ORACLE 数据库,具有里一个东西SEQUENCE,在这儿介绍

    sequence等同于序列号

    在Oracle数据库中,sequence等同于序列号,每次取的时候sequence会自动增加,一般会作用于需要按序列号排序的地方。 1、Create Sequence (注释:你需要有CREATE SEQUENCE或CREATE ANY SEQUENCE权限) CREATE ...

    oracle GoldenGate 同步oracle sequence的步骤

    oracle GoldenGate 同步oracle sequence的步骤

    Oracle数据库、SQL

    一、 数据库介绍 1 1.1表是数据库中存储数据的基本单位 1 1.2数据库标准语言 1 1.3数据库(DB) 1 1.4数据库种类 1 1.5数据库中如何定义表 1 1.6 create database dbname的含义 1 1.7安装DBMS 1 1.8宏观上是数据-->...

    oracle数据库性能优化案例分析及最佳实践

    Namespace→1:table/view/sequence/synonym/ 错误密码登陆 Namespace→79:Account status FailureParse Namespace→82:SQL AREA BUILD ADG Namespace→74:DBINSTANCE 案例二:row cache lock等待 问题背景: ...

    java自动生成Oracle sequence管理类

    Oracle自增长主键自动生成类 public static int nextID String table { if table null return 1; table table toLowerCase ; String strKey table; if sequences containsKey strKey { ...

    oracle数据库id为uuid类型时自动生成id

    oracle数据库id为uuid类型时自动生成id的工具类,不再依赖sequence自增长

Global site tag (gtag.js) - Google Analytics