首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle RAC和序列

Oracle RAC和序列
EN

Stack Overflow用户
提问于 2011-02-02 03:16:26
回答 3查看 11.4K关注 0票数 13

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

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

谢谢,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-02 03:38:56

在这种情况下,你所说的“有序”到底是什么意思?

默认情况下,群集中的每个节点都有一个单独的序列号缓存。因此,节点1可能分配值1-100,而节点2分配值101-200。从单个节点返回的值是连续的,但节点1上的会话A的值可能为15,而节点2上的会话B的值为107,因此跨会话返回的值显示为无序。

如果您指定必须对序列进行排序,那么基本上就违背了序列缓存的目的,因为Oracle现在每次请求新的序列值时都必须在节点之间进行通信。这可能会产生可观的性能开销。如果您将该序列用作一种时间戳,那么这种开销可能是必要的,但这通常并不可取。

从实际意义上讲,开销差异将高度依赖于应用程序--对于某些应用程序来说,这将是无法衡量的小问题,而对于其他应用程序来说,这将是一个重大问题。RAC节点的数量、互连的速度以及有多少互连流量也会产生影响。由于这主要是一个可伸缩性问题,实际效果将限制您的应用程序的伸缩性,这本质上是非线性的。将您的应用程序处理的事务数量翻倍将远远超过开销的两倍。

如果指定NOCACHE,那么ORDER或NOORDER的选择基本上是无关紧要的。如果指定ORDER,缓存或NOCACHE的选择基本上是无关紧要的。因此,缓存NOORDER是到目前为止最有效的,其他三个相对可互换。每次请求序列值时,它们都会涉及节点间协调和网络流量,这显然是一个潜在的瓶颈。

通常优选的是将时间戳列添加到表中以存储实际的时间戳,而不是依赖于序列来提供时间戳顺序。

票数 18
EN

Stack Overflow用户

发布于 2012-10-10 02:08:28

摘要

CACHE可以显著提高使用ORDER的序列的性能,即使在RAC上也是如此。

它仍然没有NOORDER那么快,但它可以出人意料地接近。尤其是如果一次仅在一个节点上使用该序列。

测试用例

代码语言:javascript
复制
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的两倍多。

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

为什么?

我不明白为什么使用ORDERCACHE会有这么大的不同。与通过网络发送数据的时间相比,生成数字的时间应该是无关紧要的。这让我认为要么是Oracle使用了糟糕的算法,要么是我的测试用例是错误的。(如果有人能在我的测试用例中发现问题,请告诉我。)

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

票数 12
EN

Stack Overflow用户

发布于 2011-02-02 04:30:04

序列的设计并不是为了有意义地排序。看看这个link to a response by Tom Kyte和他的一些后续回复在同一个线程中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4866959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档