Oracle Sequence值未订购

Din*_*108 11 oracle oracle10g oracle11g

可能重复:
Oracle RAC和序列

我在本地环境中配置了Oracle RAC.我分析了Sequnce的一个问题,即nextVal生成的数字没有排序.假设我第一次得到值为1,第二次得到值为21(我已将序列配置为默认的CACHE 20和NOORDER).

在搜索时我找到了解决方案,我需要对序列进行排序.我有一个问题,哪个是更好的选择,

1)CACHE和ORDER

2)NOCACHE和ORDER

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

其次,如果我将序列改为NOCACHE,无论ORDER/NOORDER如何,我都可以实现排序.

谢谢

Daz*_*zaL 17

其次,如果我将序列改为NOCACHE,无论ORDER/NOORDER如何,我都可以实现排序.

是的,因为NOCACHE实际上是有序的,因为你在每个增量上强制写入sys.seq $表,这也必须在节点上串行化.

-

我会对可能重复的答案提出质疑.RAC中的CACHE + ORDER和NOCACHE存在巨大差异.你不是用ORDER来否定CACHE; 只是降低其有效性.我个人看到中间层应用程序的性能急剧下降,因为他们在序列上使用NOCACHE并且一次访问多个节点.我们将他们的序列切换到ORDER CACHE(因为他们想要一个交叉rac命令).并且性能大幅提升.

总结:序列速度将从最快到最慢,如"CACHE NOORDER" - >"CACHE ORDER"和"NOCACHE"背后的方式.

这也很容易测试:

所以我们从标准序列开始:

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

Sequence created.
Run Code Online (Sandbox Code Playgroud)

即没有订单的CACHE.现在我们开了两个会议.我在此测试中使用的是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;                                                   
/ 
/
Run Code Online (Sandbox Code Playgroud)

现在我们运行第一个测试(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.
Run Code Online (Sandbox Code Playgroud)

所以7-8秒选择序列的100,000次迭代.

现在让我们尝试NOCACHE(ORDER vs NOORDER对此没有任何意义,因为我们在每次调用序列时都强制写入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.
Run Code Online (Sandbox Code Playgroud)

因此,对于相同的工作集,我们已经从8秒跳到8分钟.

CACHE + ORDER怎么样?

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.
Run Code Online (Sandbox Code Playgroud)

所以总结为100,000次单次呼叫提取CACHE NOORDER = 8秒NOCACHE = 8分钟CACHE ORDER = 25秒

对于缓存顺序,oracle确实在RAC节点之间进行了大量的ping操作,但是DOESNT必须将内容写回seq $,直到缓存大小用完为止,因为它全部在内存中完成.

如果我是你,我会设置一个合适的缓存大小(ps高缓存大小不会对盒内存加载,因为oracle不会将所有数字存储在RAM中;只有当前+最终数字)并考虑如果需要,请订购.