Oracle序列值未排序
可能重复:Oracle序列值未排序,oracle,oracle10g,oracle11g,Oracle,Oracle10g,Oracle11g,可能重复: 我在本地环境中配置了Oracle RAC。我分析了Sequence的一个问题,即nextVal生成的数字没有排序。假设第一次获取值为1,第二次获取值为21(我已将序列配置为默认缓存20和NOORDER) 通过搜索,我找到了解决方案,我需要对序列进行排序。我有个问题,那一个更好的选择 1) 缓存和顺序 2) 诺卡奇与秩序 我想知道上面哪一个是更好的选择,为什么 第二,如果我将序列更改为NOCACHE而不考虑ORDER/NOORDER,那么我可以实现排序吗 谢谢 其次,如果我将序列更改
我在本地环境中配置了Oracle RAC。我分析了Sequence的一个问题,即nextVal生成的数字没有排序。假设第一次获取值为1,第二次获取值为21(我已将序列配置为默认缓存20和NOORDER) 通过搜索,我找到了解决方案,我需要对序列进行排序。我有个问题,那一个更好的选择 1) 缓存和顺序 2) 诺卡奇与秩序 我想知道上面哪一个是更好的选择,为什么 第二,如果我将序列更改为NOCACHE而不考虑ORDER/NOORDER,那么我可以实现排序吗 谢谢 其次,如果我将序列更改为 NOCACHE不考虑订单/NOORDER 是的,因为NOCACHE实际上是有序的,因为您在每个增量上强制写入sys.seq$表,这也必须在节点上序列化 -- 我将对那可能重复的答案提出异议。RAC中的CACHE+顺序和NOCACHE有很大的不同。你不是在用顺序否定缓存;只是降低了它的有效性。我个人看到中间层应用程序的性能急剧下降,因为它们在一个序列上使用NOCACHE,并且同时在多个节点上访问。我们将它们的序列切换到顺序缓存(因为它们需要跨rac顺序)。性能也有了很大的提高 总之:序列速度将从最快到最慢,依次为“CACHE NOORDER”->“CACHE ORDER”和“NOCACHE”之后 这也很容易测试: 因此,我们从一个标准序列开始:
SQL> create sequence daz_test start with 1 increment by 1 cache 100 noorder;
Sequence created.
没有秩序的缓存。现在我们启动两个会话。在本测试中,我使用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):
所以7-8秒选择100000次迭代序列
现在让我们试试NOCACHE(ORDER与NOORDER对此并不相关,因为我们正在强制对序列的每个调用写入seq$)
因此,对于相同的工作集,我们从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.
总之,100000次单次调用回迁
缓存NOORDER=8秒
NOCACHE=8分钟
缓存顺序=25秒
对于缓存顺序,oracle确实在RAC节点之间执行了大量ping操作,但它不必像在内存中所做的那样,在缓存大小用完之前将内容写回seq$
<>我想,如果我是你,设置一个合适的缓存大小(P.S.一个高缓存大小不加载一个框内存,因为甲骨文不存储所有的RAM中的数字;只有当前+最后的数字),并考虑如果需要的顺序。 谢谢,现在我有理由选择“缓存和顺序”:-我想知道你能告诉我设置缓存大小的参数是什么。当然。我的样品里也有<代码>创建序列x以缓存n开始代码>其中n是缓存大小(对于0,使用关键字nocache而不是cache 0)嘿@Dazzal:-实际上我想知道如何根据您的上述评论确定缓存值,即n。我知道默认情况下缓存大小是20。但是我应该保持缓存的大小,我应该如何决定它。哦,我明白了。这取决于你从中选择的速度。例如,如果你说每秒从序列中选择100个,那么1000-10000或更多的缓存是合适的。i、 我们的目标不是敲打sys.seq$表,这将是一个减速点。如果插入较低,比如说几分钟,那么较小的缓存就可以了(例如20-100)。
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.
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.