暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

将Oracle序列从ORDER更改为NO ORDER的影响

askTom 2018-11-13
956

问题描述

我有一个表TAX_INFO,其中使用序列SEQ_TAX_INFO_ID生成主键TAX_INFO_ID。下面是序列定义。它被定义为此刻的有序

CREATE SEQUENCE  SEQ_TAX_INFO_ID  MINVALUE 1 MAXVALUE 999999999 INCREMENT BY 1 START WITH 10000 CACHE 5000 ORDER  NOCYCLE


当前,在许多查询中使用了列TAX_INFO_ID,涉及ORDER BY , MAX, MIN子句作为业务逻辑的一部分。

由于我们最近已移至RAC架构,因此需要将序列更改为无顺序,以便可以改善序列的使用。

问题是,是否会对使用中的TAX_INFO_ID的现有查询产生任何影响ORDER BY , MAX, MIN条款?


专家解答

使用RAC时,使用noorder将意味着每个实例都分配了自己的一组值。

所以首先

实例1得到1-20
实例2获取21-40
实例3获取41-60
等。

当实例 “使用” 其值时,它将获得下一个可用批次。所以如果你有上面的三个实例,无论哪个首先达到它的极限,都会得到值61-80。

因此,如果这些值进入TAX_INFO_ID,并且您正在按它排序,则行将不会按插入它们的顺序显示。

但是!

即使使用单个实例,有序序列,也不能保证TAX_INFO_ID值与插入顺序匹配!

你可以看到如下。首先创建一个表和序列:

create sequence s order;
create table t (
  c1 int primary key,
  c2 date default sysdate
);


在一个会话中运行:

declare
  id int := s.nextval;
begin

  dbms_lock.sleep ( 10 ) ;
  
  insert into t 
    values ( id, sysdate );
 
  commit;
end;
/


另一个做:

begin

  insert into t 
    values ( s.nextval, sysdate );
    
  commit; 
  
end;
/


所以第一个会话获取序列值。然后在插入之前等待10秒。第二个立即插入。

这意味着C1值是 “无序的”:

select c1, to_char ( c2, 'hh24:mi:ss' ) 
from   t
order  by c2;

C1   TO_CHAR(C2,'HH24:MI:SS')   
   2 08:29:34                   
   1 08:29:41    


因此,如果您依赖于序列值作为插入行的顺序,则already have a bug!

你可能很少打这个。但这仍然可能发生。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论