在SQL Server中,标识列值突然跳转到1001

Raj*_*lar 48 sql sql-server sql-server-2012

我正在使用Sql server 2012(Denali).我想知道为什么所有标识列值都从1001开始,依此类推.在开始Identity列从1,2开始,依此类推,并顺利添加标识,但突然它跳转到1001,1002以及包含标识列的数据库中的所有表.可能是什么原因?请协助.

Kit*_*tty 74

Microsoft已经改变了他们在SQL Server 2012中处理身份值的方式,因此您可以在重新启动SQL Server实例或服务器计算机后看到记录之间的身份差距.这个id间隙可能还有其他一些原因,可能是因为安装更新后服务器自动重启.

您可以使用以下两种选择

  • 使用跟踪标志272 o这将导致为每个生成的标识值生成日志记录.打开此跟踪标志可能会影响身份生成的性能.
  • 使用具有NO CACHE设置的序列生成器

    在SQL Server 2012上设置跟踪标志272,这是您期望的

  • 打开"SQL Server配置管理器"

  • 单击左窗格中的"SQL Server服务"
  • 右键单击右窗格中的SQL Server实例名称 - >默认值:SQL Server(MSSQLSERVER)
  • 点击"属性"
  • 单击"启动参数"
  • 在"指定启动参数"文本框中键入"-T272"
  • 点击"添加"
  • 确认更改

  • +1为好的解释.非常感谢 (8认同)

Mik*_*son 12

我相信你在对这个连接项的评论中有解释.身份重新设定中的故障转移或重新启动结果

为了提高高端机器的性能,我们在2012年引入了身份值的预分配.并且可以使用TF 272禁用此功能(然后您将获得2008R2的行为).

标识属性分别存储在元数据中.如果在身份中使用了值并且调用了增量,则将设置新的种子值.没有操作,包括Rollback,Failover,.....可以更改除DBCC重新设定之外的种子值.故障转移适用于表对象,但不适用于标识对象.因此,对于故障转移,您可以在手动故障转移之前调用检查点,但您可能会看到计划外情况的间隙.如果差距是一个问题,那么我建议你使用TF 272.

对于控制管理器关闭,我们有一个修复下一个版本(使用另一个TF).此修复程序将处理大多数控制管理器关闭案例.

  • @Damien_The_Unbeliever:不,10多年前编写系统的人做错了......而且我没有时间机器. (8认同)
  • @eraj - 正如我在你的问题评论中所说的那样,如果你*关心数值,那你就错误地使用了'IDENTITY'. (3认同)