2011-09-28 41 views
1

好吧......Oracle APEX中的SQL自動遞增偶爾會在遞增時跳過一串數字?

所以我已經創造了頂點的表具有由一個SQL序列遞增PK:

CREATE SEQUENCE seq_increment 
MINVALUE 1 
START WITH 880  
INCREMENT BY 1 
CACHE 10 

這似乎很好地工作。問題是,有時候,通常當我在早上開始並運行一個進程來進入一個新行時,它會跳過一堆數字。我只關心,因爲這些數字被用作我公司文檔的ID號,當這個工具上線時,丟失/跳過數字塊是不可接受的。

它似乎跳轉到下一個'10'號碼。即昨天我的最後一次測試分配到883,今天早上分配了890作爲下一個數字。看看我創建序列的代碼,我注意到我已經設置它來緩存10個值,以便它能更快地處理。這個緩存是否有可能在一夜之間被拋棄,並且它正在拉890,因爲它的緩存中有880-889,並且它被轉儲了?

是否還有其他潛在的原因和解決方案?讓我知道你們的想法。

回答

4

序列不會產生無間隙值。所以你會希望這些數字偶爾會被跳過。當你使用序列時,這很正常。

正如你所猜測的,最有可能的情況是,當APEX應用程序未被使用時,序列高速緩存將在共享池中過夜。你可以通過聲明你的序列NOCACHE來減少差距的頻率,但是這會降低性能,並且不會消除差距,只會使它們不那麼頻繁。

2

某些序列號已經從內存中的某個結構(我認爲共享池)中老化掉了。這是序列的預期行爲。你唯一的保證是他們是獨一無二的。如果您需要提供無間隙序列,您必須在報告時間使用例如rownum僞列。這是故意的,否則你將不得不序列化所有插入,即鎖定表。即使插入被回滾,即使這樣也無法正常工作!

5

Oracle序列永遠不能保證是連續的。如果您需要絕對連續的一組值,則需要實施自定義解決方案。

賠率是CACHE 10是你在這種情況下失去數字的原因。緩存值是將多少個序列值存儲在內存中以供將來使用。重新啓動將清除緩存並導致檢索10個新值。同樣,如果序列使用時間不夠長,當前的一組值可能會從共享池中清除,也會導致檢索一組新的值。

在您的實例中顯然不是這種情況,但序列號也可能由於回滾而丟失。涉及一個或多個序列的回滾事務丟棄序列值。