Oracle RAC和序列

时间:2011-02-01 19:16:26

标签: sql oracle oracle11g

我有各种使用序列的数据库应用程序,我将这些应用程序从没有RAC的10g迁移到Oracle RAC到使用RAC的11g。我需要有序的序列和间隙是可以容忍的。

我在考虑缓存序列的顺序,我不知道在性能上有什么影响。你认为这是一个不错的选择吗?您对序列和RAC有什么经验?

谢谢,

3 个答案:

答案 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及其一些后续回复。