我有各種使用序列的數據庫應用程序,我將這些應用程序從Oracle 10g遷移到沒有RAC的Oracle RAC,使用RAC遷移到11g。我需要有序的序列和差距是可以容忍的。Oracle RAC和序列
我想在緩存序列順序,我不知道什麼是在性能的影響。你認爲這是一個很好的選擇嗎?您對序列和RAC有什麼經驗?
謝謝,
我有各種使用序列的數據庫應用程序,我將這些應用程序從Oracle 10g遷移到沒有RAC的Oracle RAC,使用RAC遷移到11g。我需要有序的序列和差距是可以容忍的。Oracle RAC和序列
我想在緩存序列順序,我不知道什麼是在性能的影響。你認爲這是一個很好的選擇嗎?您對序列和RAC有什麼經驗?
謝謝,
在此背景下,「有序」的含義是什麼?
默認情況下,羣集中的每個節點都有一個單獨的序列號緩存。因此節點1可能將值1-100遞交,而節點2遞交值101-200。從單個節點返回的值是連續的,但節點1上的會話A可能會得到值15,而節點2上的會話B會得到值107,因此跨會話返回的值顯示不按順序。
如果指定必須對序列進行排序,則基本上會破壞序列高速緩存的目的,因爲每次請求新序列值時,Oracle必須在節點間進行通信。這有可能造成體面的性能開銷。如果你使用序列作爲一種時間戳,那麼開銷可能是必要的,但它通常並不可取。
在實際應用中的開銷差異將取決於應用程序的高度 - 對於某些應用程序而言,它將不可觀測地小,對於其他應用程序而言則是重大問題。 RAC節點的數量,互連的速度以及互連流量的多少也會起作用。由於這主要是一個可擴展性問題,所以實際效果會限制應用程序的擴展能力,這本質上是非線性的。將應用程序處理的交易量翻倍,將使開銷增加一倍以上。
如果指定NOCACHE,ORDER或NOORDER的選擇基本上是無效的。如果指定ORDER,則選擇CACHE或NOCACHE基本上是無效的。所以CACHE NOORDER是迄今爲止效率最高的,其他三個相對可以互換。每次請求序列值時,它們都將涉及節點間協調和網絡流量,這顯然是潛在的瓶頸。
通常最好將TIMESTAMP列添加到表中以存儲實際時間戳,而不是依賴序列來提供時間戳順序。
序列並非設計爲與含義排序。看看這個link to a response by Tom Kyte和他的一些後續回覆在同一個線程中。
摘要
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。
謝謝Justin,我需要根據請求維護序列的順序。來自Oracle:ORDER指定ORDER以保證序號是按請求的順序生成的。如果您使用序號作爲時間戳,則此子句很有用。對於用於生成主鍵的序列,保證順序通常不重要。 – odew 2011-02-01 19:46:47
然後指定一個緩存很可能是毫無意義的 - 我會繼續並指定NOCACHE,並接受您將爲您的序列生成增加開銷。您需要測試應用程序在RAC負載下的行爲方式,以確保此額外開銷是可接受的。 – 2011-02-01 20:05:23