自动增量主键生成奇怪的值

vel*_*ije 2 sql-server sql-server-2012

我有一个包含三列的表,基本的SELECT语句如下所示:

SELECT TOP 1000 [PatchHistoryId]
      ,CASE 
        WHEN [PatchName] LIKE N'1_%' THEN '1_aaa'
        WHEN [PatchName] LIKE N'2_%' THEN '2_bbb'
        WHEN [PatchName] LIKE N'3_%' THEN '3_ccc'
        WHEN [PatchName] LIKE N'4_%' THEN '4_ddd'
        WHEN [PatchName] LIKE N'5_%' THEN '5_eee'
        WHEN [PatchName] LIKE N'6_%' THEN '6_fff'
        WHEN [PatchName] LIKE N'7_%' THEN '7_ggg'
        WHEN [PatchName] LIKE N'8_%' THEN '8_hhh' END AS PatchName
      ,[CreatedDate]

FROM [PatchHistory]
Run Code Online (Sandbox Code Playgroud)

结果如下所示:

PatchHistoryId | PatchName | CreatedDate

-------------------------------------------

1       1_aaa   2013-07-19 12:50:14.637
2       2_bbb   2013-07-19 12:50:16.570
1002    3_ccc   2013-07-26 08:53:33.557
1003    3_ccc   2013-07-26 08:55:38.600
2002    4_ddd   2013-07-29 11:32:28.320
2003    4_ddd   2013-07-29 11:35:02.123
2004    4_ddd   2013-07-29 14:24:36.297
3002    4_ddd   2013-08-01 09:24:01.537
4002    6_fff   2013-08-06 11:18:29.990
5002    7_ggg   2013-08-08 15:22:56.990
6002    8_hhh   2013-08-20 15:15:35.157
6003    8_hhh   2013-08-20 15:16:40.300
6004    8_hhh   2013-08-20 15:18:00.177
6005    8_hhh   2013-08-20 15:18:00.370
6006    8_hhh   2013-08-20 15:18:00.587
6007    8_hhh   2013-08-20 15:18:00.747
6008    8_hhh   2013-08-20 15:18:00.957
6009    8_hhh   2013-08-20 15:18:01.100
6010    8_hhh   2013-08-20 15:18:01.263
6011    6_fff   2013-08-20 15:18:17.300
6012    8_hhh   2013-08-20 15:28:30.373
Run Code Online (Sandbox Code Playgroud)

现在,首先我发现身份值非常高,因为我知道我的插入值只有20-30次,没有删除行.假设这一点,最大身份值需要<100,但不是.

我注意到1000-1003范围内的身份属于一个日期,2000-2004属于另一个日期,6000-6012也属于另一个日期,对我来说这是如此奇怪.

似乎如果我插入数据tomorow,下一个身份将不是6013,而是7000,或更大的东西.

在这种情况下可以采取什么措施.

PS在表格设计PatchHistoryIdint,身份种子是1,增量是1.

TTo*_*oni 5

由于代码更改与新序列功能相关联,因此出于性能原因,SQL 2012中的身份分配已更改.现在,标识值预先分配为1,000(对于int列)或10,000(对于bigint列)的块.

如果实例已停止(如重新启动或故障转移),则会丢弃未使用的预分配值(因为持久的"下一个"指针已设置为下一个块).

此外,连续的身份值总是通过中止的事务丢失,但由于你有好的,每天1000块,我会假设每天重启你的实例作为原因(如果你不这样做你不应该这样做有一个很好的理由).

来源链接,请参阅Michael Duhons条目