SQL Server IDENTITY 列の増分ギャップ: キャッシュについて
一意の行識別子の生成に使用されるSQL Server の IDENTITY
列は、予期しない動作を示す場合があります。サーバーの再起動後、増分は 1 つずつ増加するのではなく、数百単位にジャンプします。これはバグではなく、SQL Server 2012 で導入されたパフォーマンスの最適化の結果です。
SQL Server はパフォーマンスを向上させるために ID 値をキャッシュします。 このキャッシュには通常、1,000 個の int
値または 10,000 個の bigint
/numeric
値が保存されます。キャッシュが使い果たされると、新しいバッチが割り当てられます。 ただし、サーバーを再起動すると、未使用のキャッシュされた値はすべて破棄されます。
観察されたジャンプは、最後の 3 桁が一定のまま (例、常に 306 で終わる)、初期割り当て 1,000 の後の残りのキャッシュ値を反映しています。
このキャッシュ メカニズムは IDENTITY
シーケンスにギャップを作成しますが、主にパフォーマンスを向上させます。 頻繁に再起動が行われない限り、影響は最小限に抑えられます。 ただし、これを軽減するためのオプションがいくつかあります:
IDENTITY
列を SEQUENCE
オブジェクトに置き換えて、キャッシュ サイズをより細かく制御できるようにします。ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = OFF;
を実行します。これらの回避策を講じたとしても、同時挿入とトランザクションのロールバックによって依然としてギャップが生じる可能性があることを覚えておくことが重要です。絶対的なシーケンスの連続性を必要とするアプリケーションの場合は、UUID ジェネレーターやカスタム シーケンスの実装などの代替手段を検討してください。
以上がSQL Server IDENTITY の増分が再起動後に急激に増加するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。