2016-02-16 106 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