摘要
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。