Sql-Server

SQL Server 2014 中的 MASSIVE Identity 列值跳躍

  • August 16, 2021

因此,在基本編碼和測試過程中,我們看到多個表的標識值出現了巨大的非模式跳躍。我們不知道任何伺服器故障或嘗試的批量操作,但 DBA 正在查看日誌。

差距不是典型的 1,000 或 10,000 在伺服器重新啟動等情況下看到的。

Application_NO對於具有 2,320 行的表,間隙為10,410,345

Transaction_Payment_NO在有 685 條記錄的表格中躍升了驚人的 1,712,149,313。

關於什麼可能導致如此大且看似隨意的跳躍的任何想法?

標識值在多個表上跳躍

一些可能的罪魁禍首:

  1. 測試過程在事務中創建許多行,然後回滾事務

正如您提到的,這似乎是最可能的原因,您目前正在進行測試。也許有一些正在執行的自動化測試對這些表進行更改,驗證結果,然後回滾更改。

事務回滾後不會重用標識值,這就是導致您在此方案中看到較大差距的原因。

  1. 有人使用了RESEED命令

您可以使用以下命令手動更改目前的“下一個身份”值:

DBCC CHECKIDENT ('dbo.Transaction_Payment_NO', RESEED, 1712149313);

這似乎不太可能,因為您或其中一位管理員將不得不竭盡全力去做。相似地…

  1. 有人手動插入了這些值

IDENTITY您可以通過首先執行以下語句將您喜歡的任何內容插入列中:

SET IDENTITY_INSERT dbo.Transaction_Payment_NO ON;
  1. 故障轉移和重啟

您在問題中提到了這一點,但只是為了完整性 - SQL Server 記憶體標識值以提高性能。但是,如果服務重新啟動或發生 AG 故障轉移,這些預先分配的標識值可能會失去。不過,這會導致更多可預測的差距(在現代版本的 SQL Server 上為 10,000 個)。

引用自:https://dba.stackexchange.com/questions/273935