gpt4 book ai didi

Oracle 序列值未排序

转载 作者:行者123 更新时间:2023-12-04 01:52:07 27 4
gpt4 key购买 nike

这个问题在这里已经有了答案:




8年前关闭。




Possible Duplicate:
Oracle RAC and sequences



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

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

1) 缓存和排序

2)NOCACHE和订单

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

其次,如果我将序列更改为 NOCACHE,而不管 ORDER/NOORDER,我能实现排序吗?

谢谢

最佳答案

Secondly, Can I achieve the ordering if I alter the sequence to be NOCACHE irrespective of ORDER/NOORDER.



是的,因为 NOCACHE 是有效排序的,因为您在每个增量上都强制写入 sys.seq$ 表,这也必须在节点上进行序列化。

——

我会在可能的重复中对接受的答案提出异议。 RAC 中的 CACHE + ORDER 和 NOCACHE 存在巨大差异。你不是用 ORDER 否定 CACHE;只是降低其有效性。我个人看到中间层应用程序的性能急剧下降,因为它们在序列上使用 NOCACHE 并同时访问多个节点。我们将他们的顺序切换到 ORDER CACHE(因为他们想要一个跨种族的顺序)。和性能大大提高。

总结:序列速度将从最快到最慢,为“CACHE NOORDER”->“CACHE ORDER”,并且落后于“NOCACHE”。

这也很容易测试:

所以我们从一个标准序列开始:
SQL> create sequence daz_test start with 1 increment by 1 cache 100 noorder;

Sequence created.

即无顺序缓存。现在我们启动两个 session 。我在此测试中使用 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 分钟。

缓存+订单怎么样?
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 次调用提取
缓存 NOORDER = 8 秒
NOCACHE = 8 分钟
缓存顺序 = 25 秒

对于缓存顺序,oracle 确实在 RAC 节点之间执行了大量 ping 操作,但它不必将内容写回 seq$,直到缓存大小用完为止,因为这一切都在内存中完成。

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

关于Oracle 序列值未排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13513936/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com