关于该
NOORDER条款,文档说:
“指定
NOORDER是否不想保证按请求顺序生成序列号。”
关键词是 保证
。
NOORDER不保证随机性,这意味着
NEXTVAL可能会产生乱序的数字。在每个节点都有序列号缓存的RAC环境中,这是主要要考虑的问题。在这些情况下,
NOORDER意味着我们无法
NEXTVAL从给定值的序列中推断出请求的序列,即,我们无法使用这些数字按创建顺序对记录进行排序。
根据您的要求。
您的要求是矛盾的。随机性意味着不可预测性。唯一性意味着可预测性。
您不能按顺序实现此功能,但可以构建自己的东西,如下所示:
create table pseudo_sequence ( used varchar2(1) default 'N' not null , id number not null , next_val number not null , primary key (used, id) )organization index/
请注意“仅索引表”语法。下一个技巧是随机填充表格。
insert into pseudo_sequence (id, next_val)with nbr as ( select level + 99999 as nx from dual connect by level <= 900000 order by dbms_random.value )select rownum, nx from nbr/
我们需要ID列来保留NEXT_VAL在表中的随机分布。没有索引,索引将强加一个顺序,我们希望避免每次执行查询时都进行排序。
接下来,我们构建一个查询以从表中获取下一个值,并将其标记为已使用:
create or replace function random_nextval return numberis pragma autonomous_transaction; cursor ps is select next_val from pseudo_sequence where used = 'N' and rownum = 1 for update of used skip locked; return_value number;begin open ps; fetch ps into return_value; update pseudo_sequence set used = 'Y' where current of ps; close ps; commit; return return_value;end;/
这是它的工作方式:
SQL> select random_nextval from dual 2 connect by level <= 5 3 /RANDOM_NEXTVAL-------------- 216000 625803 806843 997165 989896SQL> select * from pseudo_sequence where used='Y' 2 /U ID NEXT_VAL- ---------- ----------Y 1 216000Y 2 625803Y 3 806843Y 4 997165Y 5 989896SQL> select random_nextval from dual 2 connect by level <= 5 3 /RANDOM_NEXTVAL-------------- 346547 911900 392290 712611 760088SQL>
当然,我们可以说这不是随机的,因为通过查看基础表可以预测下一个值,但这也许足以满足您的需求。我不会对多用户环境中的可伸缩性做出任何保证,但是考虑到您的数字空间只有900,000个值,我认为这并不是一个主要问题。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)