ホームページ > データベース > mysql チュートリアル > SQL Server ID の増分で突然値がスキップされるのはなぜですか?

SQL Server ID の増分で突然値がスキップされるのはなぜですか?

Linda Hamilton
リリース: 2025-01-23 14:36:12
オリジナル
874 人が閲覧しました

Why Does My SQL Server Identity Increment Suddenly Skip Values?

SQL Server の ID ギャップ: 理解と軽減

概要

SQL Server の IDENTITY プロパティは、整数値を自動的にインクリメントすることで主キーの管理を簡素化します。 ただし、このシーケンスに予期しないギャップが発生し、ユーザーが困惑する可能性があります。

根本原因: ID キャッシュ

Microsoft のドキュメントでは、SQL Server (2012 以降) がパフォーマンスを最適化するために ID キャッシュを採用していると説明しています。 このキャッシュは通常、int IDENTITY 列に対して 1,000 に設定され、値のブロックを事前に割り当てます。

  • 割り当てプロセス: ID 値が必要な場合、SQL Server はキャッシュから範囲を予約します。 たとえば、現在の値が 1,205,446 の場合、1,205,447 ~ 1,206,446 が予約される可能性があります。
  • ギャップの作成: サーバーの再起動またはトランザクションのロールバックにより、これらの予約済みの未使用の値が解放され、シーケンスに顕著なギャップが生じる可能性があります。

キャッシュ サイズの影響

この例では、1,000 値のキャッシュにより、ID の増分が約 100 増加することを示しています。 1,206,321 のような値が割り当てられると、次の 1,000 が予約され、ギャップが生じます。 一貫した最後の 3 桁 (例: 321) は、予約されたブロックの終わりを反映します。

ギャップ削減のための戦略

アイデンティティのギャップは本質的に問題ではありませんが、望ましくない場合があります。 次のオプションを検討してください:

  • シーケンス (NOCACHE): SQL Server シーケンスは、キャッシュのない代替手段を提供し、コミットされていないトランザクションのみへのギャップを最小限に抑えます。
  • トレース フラグ 272: このトレース フラグは、ID 割り当ての詳細なログを提供し、ギャップの原因となるイベントの特定に役立ちます。 これはすべてのデータベースに影響することに注意してください。
  • データベース レベルのキャッシュの無効化: 新しい SQL Server バージョンの場合、ALTER DATABASE SCOPED CONFIGURATIONIDENTITY_CACHE = OFF を併用すると、特定のデータベースのキャッシュが無効になります。

重要な考慮事項

アイデンティティのギャップを完全に排除する方法はありません。 同時挿入やトランザクションの失敗によっても作成される可能性があります。 絶対的なシーケンスの整合性が必要なアプリケーションの場合は、GUID またはカスタム シーケンス生成メカニズムを検討してください。

以上がSQL Server ID の増分で突然値がスキップされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート