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.