SQL Server2014での大規模なID列の値のジャンプ

Aug 19 2020

そのため、基本的なコーディングとテストの途中で、複数のテーブルのID値にパターン化されていない大きなジャンプが見られました。サーバーのブリップや一括操作の試行は認識されていませんが、DBAはログを調べています。

ギャップは、サーバーの再起動などで見られる典型的な1,000または10,000ではありません。

のギャップApplication_NOは、2,320行のテーブルの場合は10,410,345です。

Transaction_Payment_NO 685レコードのテーブルで驚異的な1,712,149,313をジャンプしました。

何がそのような大きくて一見恣意的なジャンプを引き起こしている可能性があるかについてのアイデアはありますか?

回答

5 JoshDarnell Aug 19 2020 at 01:06

考えられる原因:

  1. テストプロセスは、トランザクションに多くの行を作成してから、トランザクションをロールバックします

あなたが現在テストをしているとあなたが言ったように、これは最もありそうな理由のようです。おそらく、これらのテーブルに変更を加え、結果を検証してから、変更をロールバックする自動テストが実行されている可能性があります。

トランザクションがロールバックされた後、ID値は再利用されません。これが、このシナリオで大きなギャップが発生する原因です。

  1. 誰かがRESEEDコマンドを使用しました

次のコマンドを使用して、現在の「次のID」値を手動で変更できます。

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

あなたまたは管理者の1人がそれを行うために邪魔にならないようにする必要があるため、これは可能性が低いようです。同様に...

  1. 誰かがそれらの値を手動で挿入しました

IDENTITY最初に次のステートメントを実行することで、好きなものを列に挿入できます。

SET IDENTITY_INSERT dbo.Transaction_Payment_NO ON;
  1. フェイルオーバーと再起動

質問でこれについて言及しましたが、完全を期すために、SQLServerはパフォーマンスを向上させるためにID値をキャッシュします。ただし、サービスが再起動したり、AGフェイルオーバーが発生したりすると、事前に割り当てられたID値が失われる可能性があります。ただし、これにより、より予測可能なギャップが発生します(SQL Serverの最新バージョンでは10,000)。