2014-12-02 52 views
0

我們正在將應用程序從Oracle移至DB2。這是一項批量工作。有加工前分配ID條目的順序邏輯:序列DB2中的預留序列範圍

選擇MY_SEQUENCE.nextval的

  1. 預訂範圍; // range_start;

    改變序列MY_SEQUENCE增加RANGE_SIZE;

    select MY_SEQUENCE.nextval;

    改變序列MY_SEQUENCE增加1;

    select MY_SEQUENCE.nextval; // range_end;從範圍內,通過內存增加值

  2. 分配ID:

    爲ID = RANGE_START:RANGE_END做

這在甲骨文工作得很好,但給了在DB2意想不到的結果。

在Oracle:

DROP SEQUENCE MY_SEQUENCE; 
CREATE SEQUENCE MY_SEQUENCE MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 50000 NOORDER NOCYCLE ; 
SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 1; 
SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 2; 
ALTER SEQUENCE MY_SEQUENCE INCREMENT BY 100000; 
SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 100002; 
ALTER SEQUENCE MY_SEQUENCE INCREMENT BY 1; 
SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 100003; 

在DB2:

DROP SEQUENCE MY_SEQUENCE; 
CREATE SEQUENCE MY_SEQUENCE AS DECIMAL(27 , 0) START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 999999999999999999999999999 NO CYCLE CACHE 50000 NO ORDER; 

SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 1; 
SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 2; 
ALTER SEQUENCE MY_SEQUENCE INCREMENT BY 100000; 
SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 150000; 
ALTER SEQUENCE MY_SEQUENCE INCREMENT BY 1; 
SELECT MY_SEQUENCE.NEXTVAL FROM DUAL; // 5000050001; 

我認爲150000可以通過緩存大小來解釋。不過,我還不知道5000050001的價值。這裏的任何幫助都非常感謝。

注:

  • 林意識到ALTER語句被非事務性的。但是,該進程在啓動時獨佔訪問數據庫,並運行非分佈式和單線程。
  • DB2以ORA兼容模式運行
  • 如果使用DB2序列下一個val,則會出現DB2中的相同問題:VALUES NEXT VALUE FOR MY_SEQUENCE;
  • 有序序列相同的問題
+1

我認爲這是您的流程的一部分,這意味着這個流程首先是有缺陷的。 'ALTER'應該是_rare_,通常是一次性的語句。你到底在做什麼跳躍範圍? Autogen id值不應該影響(通常)。這表明你有某種多部分的關鍵,這違反了良好的規範化實踐。如果你真的需要做這樣的事情,我會使用2個序列 - 一個每次跳過100000個,一個跳過'1'(或者看看ROW_NUMBER()是否給出了合理的結果) 。 – 2014-12-02 10:30:59

+0

但是我需要'改變'來在我的過程結束後同步序列,對嗎? – Denis 2014-12-02 11:15:22

+0

是的,你仍然需要重置下一批作業的序列(我可能會建議在下一次開始時使用)。但我仍然認爲你這樣做的事實意味着你的設計或實施過程很差。如果這是爲了追蹤目的,只需使用一個自動識別號。據推測,每個較大的跳躍信號應該是父表的一部分,而小的表是子表的一部分... – 2014-12-02 11:31:36

回答

0

塗改序列沒有緩存固定的問題。

+0

如果smb知道不需要改變NO CACHE的更好的答案,我會接受。 – Denis 2014-12-02 10:08:28

+0

沒有其他答案 - 第一次訪問序列緩存「CACHE」子句所指定的多個值,並且由於您將增量值設置爲100000,所以序列向前移動50000次100000。 – mustaccio 2014-12-02 15:19:33