ode*_*dew 13 sql oracle oracle11g
我有各种使用序列的数据库应用程序,我将这些应用程序从没有RAC的10g迁移到Oracle RAC到使用RAC的11g.我需要有序的序列和间隙是可以容忍的.
我正在考虑缓存序列的顺序,我不知道在性能上有什么影响.你认为这是一个不错的选择吗?您对序列和RAC有什么经验?
谢谢,
Jus*_*ave 17
在这种情况下,"有序"究竟是什么意思?
默认情况下,群集中的每个节点都有一个单独的序列号缓存.因此,节点1可以分发值1-100,而节点2分发值101-200.从单个节点返回的值是顺序的,但节点1上的会话A可能获得值15,而节点2上的会话B获取值107,因此会话中返回的值显示为乱序.
如果指定必须对序列进行排序,则基本上无法实现序列高速缓存的目的,因为每次请求新的序列值时,Oracle现在必须在节点之间进行通信.这有可能产生相当大的性能开销.如果您将序列用作某种时间戳,则可能需要这种开销,但通常不需要.
实际上的开销差异将取决于高度依赖于应用程序 - 对于某些应用程序来说它将是无法估量的,对于其他应用程序而言则是一个重大问题.RAC节点的数量,互连的速度以及互连流量的数量也将有所贡献.由于这主要是一个可伸缩性问题,实际效果将限制您的应用程序扩展的程度,这本质上是非线性的.将应用程序处理的事务量加倍可能会使开销增加一倍以上.
如果指定NOCACHE,则选择ORDER或NOORDER基本上是无关紧要的.如果指定ORDER,则CACHE或NOCACHE的选择基本上是无关紧要的.所以CACHE NOORDER是目前效率最高的,其他三个是相对可互换的.每次请求序列值时,它们都将涉及节点间协调和网络流量,这显然是一个潜在的瓶颈.
通常最好将TIMESTAMP列添加到表中以存储实际时间戳,而不是依赖于序列来提供时间戳顺序.
Jon*_*ler 11
摘要
CACHE
ORDER
即使在RAC上,也可以显着提高使用序列的性能.
它仍然没有那么快NOORDER
,但它可以令人惊讶地接近.特别是如果序列一次仅用在一个节点上.
测试用例
SQL> create sequence cache_order cache 20 order;
Sequence created.
SQL> create sequence cache_noorder cache 20 noorder;
Sequence created.
SQL> create sequence nocache_order nocache order;
Sequence created.
SQL> create sequence nocache_noorder nocache noorder;
Sequence created.
SQL> set timing on
SQL> declare
2 v_temp number;
3 begin
4 for i in 1 .. 100000 loop
5 v_temp := cache_order.nextval;
6 end loop;
7 end;
8 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:08.44
SQL> declare
2 v_temp number;
3 begin
4 for i in 1 .. 100000 loop
5 v_temp := cache_noorder.nextval;
6 end loop;
7 end;
8 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:07.46
SQL> declare
2 v_temp number;
3 begin
4 for i in 1 .. 100000 loop
5 v_temp := nocache_order.nextval;
6 end loop;
7 end;
8 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:35.15
SQL> declare
2 v_temp number;
3 begin
4 for i in 1 .. 100000 loop
5 v_temp := nocache_noorder.nextval;
6 end loop;
7 end;
8 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:35.10
Run Code Online (Sandbox Code Playgroud)
测试用例说明
我的结果是在2节点RAC上获得的.只显示了一个结果集,但我在不同的数据库上多次运行测试用例,并获得了几乎相同的结果.
我还在不同节点上同时运行测试.在CACHE
仍然显著改善ORDER
,虽然CACHE NOORDER
比快两倍以上CACHE ORDER
.
我在过去的其他环境中也注意到了类似的行为,尽管我没有任何结果.
为什么?
我不明白为什么CACHE
在ORDER
使用时会产生如此大的差别.与通过网络发送数据的时间相比,生成数字的时间量应该是无关紧要的.这让我觉得Oracle使用的算法很差,或者我的测试用例是错误的.(如果有人发现我的测试用例有问题,请告诉我.)
此外,此答案仅讨论生成序列的时间.使用可能还有其他好处NOORDER
.例如,减少的索引争用,如所描述这里.
归档时间: |
|
查看次数: |
10293 次 |
最近记录: |