Oracle SEQUENCE的值是不排序[复制](Oracle Sequence value ar

2019-07-04 01:43发布

可能重复:
甲骨文RAC和序列

我在我的本地环境配置的Oracle RAC。 我分析了Sequnce一个问题,即通过NEXTVAL产生的数量是没有顺序的。 假设第一次我得到的值作为1,第二时间获得得到的值作为21(我已经配置的顺序与缺省高速缓存20和NOORDER)。

在搜索,我发现,我需要订购的序列的解决方案。 我有问题,这是更好的选择去用,

1)CACHE和ORDER

2)NOCACHE和ORDER

我想知道哪些上面的一个是更好的选择,为什么?

其次,我可以实现排序,如果我改变的顺序进行非缓存不论ORDER / NOORDER。

谢谢

Answer 1:

其次,我可以实现排序,如果我改变的顺序进行非缓存不论ORDER / NOORDER。

由于是NOCACHE有效顺序你强迫写的sys.seq $表上的每个增量,这也在连载过的节点了。

-

我会反对接受的答案在可能重复。 存在CACHE + ORDER和NOCACHE在RAC的巨大差异。 你是不是否定与秩序缓存; 只是降低了其有效性。 我亲眼见过一个中间层应用程序的性能,因为它们使用NOCACHE上的序列,并立即进行了访问多个节点上的显着降低。 我们交换他们的顺序ORDER CACHE(因为他们想要一个跨RAC顺序)。 和性能大幅提高。

总结:该序列的速度将是最快到最慢作为“CACHE NOORDER” - >“CACHE令”的方式方法远远落后“NOCACHE”。

这是容易测试过:

因此,我们启动一个标准序列:

SQL> create sequence daz_test start with 1 increment by 1 cache 100 noorder;

Sequence created.

IE缓存,没有秩序。 现在我们火了两个会话。 我使用的是4节点RAC数据库10.2.0.4在这个测试:

我的测试脚本是

select instance_number from v$instance;              
set serverout on
declare                                                     
 v_timer   timestamp with time zone := systimestamp;  
 v_num number(22);                                    
begin                                                  
 for idx in 1..100000                                 
 loop                                                 
   select daz_test.nextval into v_num from dual;      
 end loop;                                            
 dbms_output.put_line(systimestamp - v_timer);        
end;                                                   
/ 
/

现在我们运行的第一个测试(CACHE NOORDER):

SESSION 1                                       SESSION 2
SQL> @run_test                                  SQL> @run_test

INSTANCE_NUMBER                                 INSTANCE_NUMBER
---------------                                 ---------------
              2                                               1


PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.


PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

SQL> @run_test                                  SQL> @run_test

INSTANCE_NUMBER                                 INSTANCE_NUMBER
---------------                                 ---------------
              2                                               1

+000000000 00:00:07.309916000                   +000000000 00:00:07.966913000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

+000000000 00:00:08.430094000                   +000000000 00:00:07.341760000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

所以7-8秒,以次序选择10万次迭代。

现在,让我们尝试NOCACHE(ORDER VS NOORDER是irrelavant这一点,因为我们并强制SEQ $写为每次调用序列)。

SQL> alter sequence daz_test nocache;

Sequence altered.

SESSION 1                                       SESSION 2
SQL> @run_test                                  SQL> @run_test

INSTANCE_NUMBER                                 INSTANCE_NUMBER
---------------                                 ---------------
              2                                               1

+000000000 00:08:20.040064000                   +000000000 00:08:15.227200000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

+000000000 00:08:30.140277000                   +000000000 00:08:35.063616000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

所以我们从8秒跃升至8分钟为同一工作组。

怎么样缓存+订单?

SQL> alter sequence daz_test cache 100 order;

Sequence altered.

SQL> @run_test                                  SQL> @run_test

INSTANCE_NUMBER                                 INSTANCE_NUMBER
---------------                                 ---------------
              2                                               1

+000000000 00:00:25.549392000                   +000000000 00:00:26.157107000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

+000000000 00:00:26.057346000                   +000000000 00:00:25.919005000

PL/SQL procedure successfully completed.        PL/SQL procedure successfully completed.

因此,在总结100,000单个呼叫取CACHE NOORDER =8秒NOCACHE =8分钟CACHE ORDER =25秒

缓存秩序,甲骨文确实做了很多的RAC节点之间执行ping命令,但它没有 ,直到缓存大小用完,它与所有在内存中完成写东西回SEQ $。

我想,如果我是你,设置适当的缓存大小(PS高缓存的大小并没有把包装盒上的内存负载,因为Oracle不存储在RAM中的所有号码,只在当前+最终数目),并考虑如果需要订购。



文章来源: Oracle Sequence value are not ordered [duplicate]