身份列值突然跳到1001在SQL Server中
我正在使用Sql server 2012(Denali)。 我只是想知道为什么所有的标识列值从1001开始,依此类推。 在开始标识列从1,2开始,依此顺序添加标识,但突然跳到1001,1002以后,包含标识列的数据库中的所有表都跳转到1001,1002。 可能是什么原因。 请协助。
微软已经改变了他们在SQL Server 2012中处理身份值的方式,因此在重新启动SQL服务器实例或服务器机器后,您可以看到logging之间的身份差距。 这个id差距可能还有一些其他原因,这可能是由于在安装更新后自动重启服务器。
您可以使用以下两种select
- 使用跟踪标志272 o这将导致为每个生成的标识值生成日志logging。 打开此跟踪标志可能会影响身份生成的性能。
-
使用NO CACHE设置的序列发生器
在SQL Server 2012上设置您所期望的跟踪标志272
-
打开“SQL Serverconfigurationpipe理器”
- 点击左侧窗格中的“SQL Server服务”
- 右键单击右边的SQL Server实例名称 – >默认值:SQL Server(MSSQLSERVER)
- 点击“属性”
- 点击“启动参数”
- 在“指定启动参数”文本框中键入“-T272”
- 点击“添加”
- 确认更改
我相信你在这个连接项目的评论中有解释。 重置身份的故障转移或重新启动结果
为了提高高端机器的性能,我们在2012年引入了身份值的预分配。这个特性可以通过使用TF 272来禁用(那么您将从2008R2中得到该行为)。
身份属性分别存储在元数据中。 如果在身份中使用了一个值并且调用了增量,那么将会设置新的种子值。 没有操作,包括回滚,故障转移,…..可以改变种子值,除了DBCC种子。 故障转移适用于表对象,但不包含标识对象。 因此,对于故障转移,您可以在手动故障转移之前调用检查点,但是您可能会发现计划外情况的差异。 如果差距是一个问题,那么我build议你使用TF 272。
对于控制pipe理器closures,我们有一个修复下一个版本(与另一个TF)。 此修复将处理大多数控制pipe理器closures情况。
我想你可以使用序列,序列给你100%完全的控制,并在许多方面远远优于身份…身份是如此该死的简单和方便
http://msdn.microsoft.com/en-us/library/ff878091.aspx
据我所知,当你做一个身份插入和失败,身份无论如何,validation
与序列,你可以使它“填补”使用周期的差距。 尽pipe艾米·巴瑞特(Amy Barrett)指出这是在交易范围之外产生的。
在使用caching时,性能优化也可能有用。