SQL Server 2014 中的 MASSIVE 标识列值跳转

Bik*_*own 2 sql-server identity sql-server-2014

因此,在基本编码和测试过程中,我们看到多个表的 Identity 值出现了巨大的无模式跳跃。我们不知道任何服务器故障或尝试进行批量操作,但 DBA 正在查看日志。

差距不是典型的 1,000 或 10,000 与服务器重启等情况。

对于Application_NO具有 2,320 行的表,其间隔为10,410,345

Transaction_Payment_NO 对于包含 685 条记录的表,跳出惊人的 1,712,149,313 条记录。

关于什么可能导致如此大且看似随意的跳跃的任何想法?

标识值在多个表上跳转

Jos*_*ell 5

一些可能的罪魁祸首:

  1. 测试过程在一个事务中创建多行,然后回滚事务

这似乎是最可能的原因,正如您提到的,您目前正在进行测试。也许正在运行一些自动化测试来更改这些表,验证结果,然后回滚更改。

事务回滚后,不会重用标识值,这就是导致您在此场景中看到很大差距的原因。

  1. 有人使用了RESEED命令

您可以使用以下命令手动更改当前的“下一个身份”值:

DBCC CHECKIDENT ('dbo.Transaction_Payment_NO', RESEED, 1712149313);
Run Code Online (Sandbox Code Playgroud)

这似乎不太可能,因为您或其中一位管理员将不得不竭尽全力做到这一点。相似地...

  1. 有人手动插入了这些值

您可以IDENTITY通过首先运行以下语句将您喜欢的任何内容插入到列中:

SET IDENTITY_INSERT dbo.Transaction_Payment_NO ON;
Run Code Online (Sandbox Code Playgroud)
  1. 故障转移和重新启动

您在问题中提到了这一点,但只是为了完整性 - SQL Server 缓存标识值以提高性能。但是,如果服务重新启动或发生 AG 故障转移,这些预先分配的标识值可能会丢失。这会导致更可预测的差距(在现代版本的 SQL Server 上为 10,000)。