可能重复:
Oracle RAC and sequences
我在本地环境中配置了Oracle RAC。我分析了Sequnce的一个问题,即nextVal生成的数字没有排序。假设我第一次得到值为1,第二次得到值为21(我已经将序列配置为默认的CACHE 20和NOORDER)。
在搜索时,我找到了解决方案,我需要订购序列。我有一个问题,哪个是更好的选择,
1)CACHE和ORDER
2)NOCACHE和ORDER
我想知道上面哪一个是更好的选择,为什么?
其次,如果我将序列改为NOCACHE而无论ORDER / NOORDER如何,我能否实现排序。
由于
答案 0 :(得分: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.
即没有订单的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;
/
/
现在我们运行第一个测试(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 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.
所以我们从同一工作集的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.
总结了100,000次单次呼叫提取 CACHE NOORDER = 8秒 NOCACHE = 8分钟 CACHE ORDER = 25秒
对于缓存顺序,oracle确实在RAC节点之间进行了大量的ping操作,但它 DOESNT 必须将东西写回seq $,直到缓存大小用完为止,因为它全部完成了记忆。
如果我是你,我会设置一个合适的缓存大小(ps高缓存大小不会对盒内存造成负担,因为oracle不会将所有数字存储在RAM中;只有当前+最终数字)并在需要时考虑ORDER。