ホームページ >データベース >mysql チュートリアル >SQL Server 2012 の ID 列が再起動後に 100 秒ずつ増加するのはなぜですか?

SQL Server 2012 の ID 列が再起動後に 100 秒ずつ増加するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-23 14:41:09638ブラウズ

Why Does My SQL Server 2012 Identity Column Increment by 100s After a Restart?

SQL Server 2012 の自動インクリメント列の異常な増加の問題

SQL Server 2012 では、異常な動作が観察されました。「Fee」テーブルの「ReceiptNo」列の自動インクリメント値が断続的に 100 ずつ増加します。これは、自動インクリメント列の通常の増分パターンと矛盾します。

異常な動作の詳細:

  • 自己増分ジャンプは 100 ずつ増加しますが、最後の 3 桁は同じままです (例: 306)。
  • この動作は、コンピューターの再起動後にトリガーされます。

理由:

この動作は、SQL Server 2012 で導入されたパフォーマンスの向上の結果です。デフォルトでは、自動インクリメント値を int 列に割り当てるときに、データベースは 1000 個の値をキャッシュするようになりました。再起動後、キャッシュされた未使用の値が失われる可能性があり、自動インクリメント シーケンスにギャップが生じる可能性があります。

ドキュメント参照:

SQL Server ドキュメントの説明:

「パフォーマンス上の理由から、SQL Server は自動インクリメント値をキャッシュする場合があり、データベースの障害またはサーバーの再起動中に、割り当てられた値の一部が失われる可能性があります。これにより、挿入中に自動インクリメント値にギャップが生じる可能性があります」 ."

考えられる解決策:

自動インクリメント列のギャップが懸念される場合は、次の回避策を検討してください:

  • Use SEQUENCE: より小さいキャッシュ サイズのシーケンスを定義し、列のデフォルト値に「NEXT VALUE FOR」を使用します。
  • トレース フラグ 272 を有効にします: これにより、自己増加する値の割り当てがログに記録され、ギャップを確認できるようになります。
  • 自動増加キャッシュを無効にする: 特定のデータベースに対して「ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = OFF」を実行します。

重要なヒント:

これらのソリューションは完全にギャップのない動作を保証するものではないことを理解することが重要です。自動インクリメント列自体は、障害やロールバックされたトランザクションによるギャップのないシーケンスを保証しません。真にギャップのない値を得るには、カスタム アルゴリズムや外部キー ジェネレーターなどの他のソリューションを検討してください。

以上がSQL Server 2012 の ID 列が再起動後に 100 秒ずつ増加するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。