58

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

4

3 回答 3

82

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”

  • 点击“添加”

  • 确认更改

于 2013-07-11T10:55:15.520 回答
13

我相信您在对此连接项目的评论中有解释。故障转移或重新启动导致重新植入身份

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

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

对于控制管理器关闭,我们对下一个版本(使用另一个 TF)进行了修复。此修复将处理大多数控制管理器关闭情况。

于 2013-07-11T07:19:11.230 回答
1

我想您可以使用序列代替,序列为您提供 100% 的完全控制权,并且在许多方面与身份相比要优越得多......身份就是如此简单和方便

http://msdn.microsoft.com/en-us/library/ff878091.aspx

据我所知,当您使用身份进行插入并失败时,无论如何都会使用身份,已验证

使用序列,您可以使用循环使其“填补”空白。虽然,正如 Amy Barrett 指出的那样,这是在交易范围之外创建的。

当您使用可能有用的缓存时,有一个性能优化。

于 2013-07-11T10:55:10.637 回答