问题描述
我有一个表TAX_INFO,其中使用序列SEQ_TAX_INFO_ID生成主键TAX_INFO_ID。下面是序列定义。它被定义为此刻的有序
当前,在许多查询中使用了列TAX_INFO_ID,涉及ORDER BY , MAX, MIN子句作为业务逻辑的一部分。
由于我们最近已移至RAC架构,因此需要将序列更改为无顺序,以便可以改善序列的使用。
问题是,是否会对使用中的TAX_INFO_ID的现有查询产生任何影响ORDER BY , MAX, MIN条款?
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值与插入顺序匹配!
你可以看到如下。首先创建一个表和序列:
在一个会话中运行:
另一个做:
所以第一个会话获取序列值。然后在插入之前等待10秒。第二个立即插入。
这意味着C1值是 “无序的”:
因此,如果您依赖于序列值作为插入行的顺序,则already have a bug!
你可能很少打这个。但这仍然可能发生。
所以首先
实例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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




