2012-11-22 60 views
10

可能重复:
Oracle RAC and sequences甲骨文序列值是无序的

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

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

1)CACHE和ORDER

2)NOCACHE和ORDER

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

其次,如果我将序列更改为NOCACHE而不考虑ORDER/NOORDER,我可以实现排序吗?

感谢

回答

15

其次,我能做到的排序,如果我改变的顺序是 NOCACHE不论ORDER/NOORDER的。

是的,因为NOCACHE是有效的命令,因为你迫使每个增量sys.seq $表写入,每个增量必须在节点上串行化。

-

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

总结:该序列的速度将是最快到最慢作为“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秒来选择序列的100,000次迭代。

现在让我们尝试NOCACHE(ORDER与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. 

所以我们已经从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. 

因此,在总结10万单呼取 CACHE NOORDER =8秒 NOCACHE =8分钟 CACHE ORDER =25秒

缓存秩序,Oracle并做RAC之间执行ping的很多节点,但它必须将内容写回到seq $,直到缓存大小用完为止,因为它全部在内存中完成。

我会如果我是你,设置一个合适的缓存大小(ps高缓存大小不会把负载放在盒子内存,因为oracle不会将所有数字存储在RAM中;只有当前+最终号码),并在需要时考虑订单。

+0

谢谢,现在我有理由去“缓存和订单” –

+0

: - 我想知道你能告诉我什么是设置缓存大小的参数。 –

+0

当然。这实际上也在我的样本中。 '创建序列x从一个缓存n开始; '其中n是缓存大小(对于0,使用关键字nocache而不是缓存0) – DazzaL