2013-10-21 64 views
0

我知道序列並不能保證沒有間隙,但我想盡量減少它們的出現,所以它們只會在特殊情況下發生(最好只在事務回滾時)。在序列生成過程中最大限度地減少間隙的出現

我在RAC中有幾個節點可以同時訪問序列。

create sequence seq_1 start with 1 order; # this seems to return numbers without gaps, but what will happen when database is restarted? will cached elements be dropped? 
create sequence seq_2 start with 1 nocache; # this one also seems to return numbers in order without gaps, but I heard some objections about using nocache as it hinders performance 
create sequence seq_3 start with 1 nocache order; # any improvements over previous two? 

那麼哪一個更好?

作爲替代方案,我可以使用表來存儲序列號,但是目前我想考慮基於序列的解決方案而不是基於表格。

謝謝。

回答

1

對於第一條語句,如果數據庫重新啓動,NOCACHE沒有指定,所以默認爲20,所以肯定會丟失數字。但是,擔心丟失數據是毫無意義的,因爲回滾,關機肯定會「失去」一個數字(正如你所說的那樣)。如果你有CACHE = NOCACHE,你當然不會「輸」任何,你沒有任何緩存會丟失,如果你插入一個緩存的序列,你會失去一些在任何情況下,序列都不是無間隙的 - EVER,它們100%保證在 的某個點上有間隙100%「

使用ORDER僅用於保證RAC的有序生成。如果您使用獨佔模式,則順序號始終按順序生成。由於NOORDER是默認設置,請使用ORDER關鍵字。

如果您忽略了CACHE和NOCACHE,那麼數據庫默認會緩存20個序列號。如果您在Oracle Real Application Clusters環境中使用序列,Oracle建議使用CACHE設置來提高性能。

如果您想按自己的方式管理它,請轉到NOCYLCE。

一起使用CACHE和NOORDER選項可以獲得最佳性能。 CACHE選項在沒有ORDER選項的情況下使用,每個實例高速緩存一個單獨的數字範圍,並且序列號可能由不同的實例亂序分配。

CACHE選項使每個實例都緩存自己的數字範圍,從而減少了Oracle數據字典的I/O,NOORDER選項消除了互連上的消息流量,以協調所有實例的數字順序分配數據庫。 NOCACHE將是緩慢的...

閱讀this

我的建議是一個臨時表來保存seqname的,STARTVAL,ENDVAL,CURRVAL爲列,把它們作爲CURRVAL + 1和更新最新的。 - 嚴格的編號,可以有更好的控制,但重新發明輪子。

如果你仍然需要堅持序列,那麼我的建議是NOCACHE,ORDER,NOCYCLE。

+0

這與我想要達到的目的相反。 RAC中的每個節點都會緩存20個元素,因此當從不同節點訪問序列時,會出現像這樣的1,20,2,21。 –

+0

對不起,沒有注意到真正的應用程序集羣。我會重新發布。 – SriniV

+0

建立自己的vs使用NOCACHE,ORDER,NOCYCLE序列對象有什麼好處? –

相關問題