Oracle RAC和序列

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

摘要

CACHEORDER即使在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.

我在过去的其他环境中也注意到了类似的行为,尽管我没有任何结果.

为什么?

我不明白为什么CACHEORDER使用时会产生如此大的差别.与通过网络发送数据的时间相比,生成数字的时间量应该是无关紧要的.这让我觉得Oracle使用的算法很差,或者我的测试用例是错误的.(如果有人发现我的测试用例有问题,请告诉我.)

此外,此答案仅讨论生成序列的时间.使用可能还有其他好处NOORDER.例如,减少的索引争用,如所描述这里.