2011-02-01 79 views
13

我有各種使用序列的數據庫應用程序,我將這些應用程序從Oracle 10g遷移到沒有RAC的Oracle RAC,使用RAC遷移到11g。我需要有序的序列和差距是可以容忍的。Oracle RAC和序列

我想在緩存序列順序,我不知道什麼是在性能的影響。你認爲這是一個很好的選擇嗎?您對序列和RAC有什麼經驗?

謝謝,

回答

17

在此背景下,「有序」的含義是什麼?

默認情況下,羣集中的每個節點都有一個單獨的序列號緩存。因此節點1可能將值1-100遞交,而節點2遞交值101-200。從單個節點返回的值是連續的,但節點1上的會話A可能會得到值15,而節點2上的會話B會得到值107,因此跨會話返回的值顯示不按順序。

如果指定必須對序列進行排序,則基本上會破壞序列高速緩存的目的,因爲每次請求新序列值時,Oracle必須在節點間進行通信。這有可能造成體面的性能開銷。如果你使用序列作爲一種時間戳,那麼開銷可能是必要的,但它通常並不可取。

在實際應用中的開銷差異將取決於應用程序的高度 - 對於某些應用程序而言,它將不可觀測地小,對於其他應用程序而言則是重大問題。 RAC節點的數量,互連的速度以及互連流量的多少也會起作用。由於這主要是一個可擴展性問題,所以實際效果會限制應用程序的擴展能力,這本質上是非線性的。將應用程序處理的交易量翻倍,將使開銷增加一倍以上。

如果指定NOCACHE,ORDER或NOORDER的選擇基本上是無效的。如果指定ORDER,則選擇CACHE或NOCACHE基本上是無效的。所以CACHE NOORDER是迄今爲止效率最高的,其他三個相對可以互換。每次請求序列值時,它們都將涉及節點間協調和網絡流量,這顯然是潛在的瓶頸。

通常最好將TIMESTAMP列添加到表中以存儲實際時間戳,而不是依賴序列來提供時間戳順序。

+0

謝謝Justin,我需要根據請求維護序列的順序。來自Oracle:ORDER指定ORDER以保證序號是按請求的順序生成的。如果您使用序號作爲時間戳,則此子句很有用。對於用於生成主鍵的序列,保證順序通常不重要。 – odew 2011-02-01 19:46:47

+0

然後指定一個緩存很可能是毫無意義的 - 我會繼續並指定NOCACHE,並接受您將爲您的序列生成增加開銷。您需要測試應用程序在RAC負載下的行爲方式,以確保此額外開銷是可接受的。 – 2011-02-01 20:05:23

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 NOORDERCACHE ORDER的兩倍多。

我在過去的其他環境中也注意到了類似的行爲,雖然我沒有任何結果。

爲什麼?

我不明白爲什麼CACHE在使用ORDER時會產生如此大的差異。與通過網絡發送數據的時間相比,生成數字的時間量應該是不相關的。這讓我認爲Oracle要麼使用的算法不好,要麼我的測試用例是錯誤的。 (如果有人可以在我的測試用例中發現問題,請告訴我。)

此外,此答案僅討論生成序列的時間。使用NOORDER可能還有其他好處。例如,減少索引爭用,如描述here