2016-02-16 144 views
-3

上工作正常(我的英語很抱歉...)自動增量與IDENTITY不是SQL Server 2008 Express的

我有這個表

CREATE TABLE [dbo].[Expedients] 
(
    [IdExpedient] [numeric](18, 0) IDENTITY(1,1) NOT NULL, 
    ... 
) 

如果我得到的所有idExpedient S於一個8.000登記表使用

select idExpedient 
from expdients 
order by idexpedients desc 

計算德差一個idExpedient和下面的一個之間(中,然後過濾差高達100)我得到這樣的:

idExp Dif. 
348376 20000 
328375 10000 
318345 10000 
308308 9998 
298121 9997 
288111 9941 
278098 9999 
267924 9979 
257752 9994 
247702 9951 
237694 9999 
227657 9997 
217639 10000 
207604 9981 
197576 10001 
187285 9999 
177285 9998 
167271 9999 
157268 9976 
147269 10001 
137268 10001 
127266 10000 
117248 9988 
107248 10001 
97181 9984 
87167 9990 
77102 9746 
67067 9999 
57038 10000 
47027 9999 
37013 9997 
26981 10000 
16979 9998 

是否有人知道發生了什麼事?

+0

你能告訴我們你的查詢嗎? –

+0

記錄是否被刪除?顯然,這個序列會有空白。 –

+0

是,一些次記錄已被刪除,但並不10.000記錄,這就是爲什麼我兩個ID – DavidB

回答

1

IDENTITY只能保證該數字將始終大於以前的,不是他們必然是1大。我相信這個數字被緩存在內存中,並且每次分配時都不會寫入磁盤(如果您正在執行分配,則在每次分配時寫入磁盤可能會產生相當多的開銷)。

我的觀察是,當它從磁盤加載下一個數字,它與數加上另一個號碼更新磁盤,說接下來+ 1000(如Oracle如何處理序列和它們的緩存值)。當它分配了所有這些IDENTITY值(在本例中爲1000)時,它會再次更新磁盤,並再次添加1000.

這意味着如果服務器在某些時間點嚴重關閉,那麼最後一個實際分配的號碼是(保證)少於下一個要分配的數字,但不少於1個。因此你可以獲得差距。

請注意,我已經使用了緩存大小數1000不被任何文件的任何地方支持。我只是用它來使我的觀點清晰可辨。

PS:看到here。該答案表示未分配的數字在服務器重新啓動時總是丟失。

+0

這僅適用於2012+ SQL服務器,它顯然不是這種情況下之間,100多個差分濾波器的情況。 – krtek

+0

好吧,所以鏈接的答案是不恰當的,但我的答案是立場。自從20年前的SQL Server v6.0以來,我已經看到了這種行爲。 –

+0

是的,這就是爲什麼我沒有downvoted你的答案 – krtek