我有各种使用序列的数据库应用程序,我将这些应用程序从没有RAC的10g迁移到Oracle RAC到使用RAC的11g。我需要有序的序列和间隙是可以容忍的。
我在考虑缓存序列的顺序,我不知道在性能上有什么影响。你认为这是一个不错的选择吗?您对序列和RAC有什么经验?
谢谢,
答案 0 :(得分:17)
在这种情况下,“被命令”究竟是什么意思?
默认情况下,群集中的每个节点都有一个单独的序列号缓存。因此,节点1可以分发值1-100,而节点2分发值101-200。从单个节点返回的值是顺序的,但节点1上的会话A可能获得值15,而节点2上的会话B获取值107,因此会话中返回的值显示为乱序。
如果指定必须对序列进行排序,则基本上无法实现序列缓存的目的,因为Oracle现在每次请求新的序列值时都必须在节点之间进行通信。这有可能产生相当大的性能开销。如果您将序列用作某种时间戳,则可能需要这种开销,但通常不需要。
实际上的开销差异将取决于高度依赖于应用程序 - 对于某些应用程序而言,这将是无法估量的,对于其他应用程序而言则是一个重大问题。 RAC节点的数量,互连的速度以及互连流量的数量也将有所贡献。由于这主要是一个可伸缩性问题,实际效果将限制您的应用程序扩展的程度,这本质上是非线性的。将应用程序处理的事务量加倍可能会使开销增加一倍以上。
如果指定NOCACHE,则选择ORDER或NOORDER基本上是无关紧要的。如果指定ORDER,则CACHE或NOCACHE的选择基本上是无关紧要的。所以CACHE NOORDER是迄今为止效率最高的,其他三个是相对可互换的。每次请求序列值时,它们都将涉及节点间协调和网络流量,这显然是一个潜在的瓶颈。
通常最好将TIMESTAMP列添加到表中以存储实际时间戳,而不是依赖于序列来提供时间戳顺序。
答案 1 :(得分: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
测试用例注释
我的结果是在2节点RAC上获得的。只显示了一个结果集,但我在不同的数据库上多次运行测试用例,并获得了几乎相同的结果。
我还在不同的节点上同时运行测试。尽管CACHE
的速度是ORDER
的两倍多,但CACHE NOORDER
仍然显着提高CACHE ORDER
。
我过去也注意到其他环境中的类似行为,但我没有任何结果。
<强>为什么吗
我不明白为什么CACHE
在使用ORDER
时会产生如此大的差异。与通过网络发送数据的时间相比,生成数字的时间量应该是无关紧要的。这让我觉得Oracle使用的算法很差,或者我的测试用例是错误的。 (如果有人发现我的测试用例有问题,请告诉我。)
此外,此答案仅讨论生成序列的时间。使用NOORDER
可能还有其他好处。例如,减少了索引争用,如here所述。
答案 2 :(得分:2)
序列的设计不符合意义。在同一个帖子中查看此link to a response by Tom Kyte及其一些后续回复。