SQL Server 2012(Denali)を使用しています。すべてのID列の値が1001から始まるのはなぜだろうか。最初のIdentity
列は1,2などから始まり、IDをスムーズに追加しますが、ID列を含むデータベース内のすべてのテーブルで突然1001,1002以降にジャンプします。その理由は何でしょうか?手伝ってください。
Microsoftは、SQL Server 2012でID値を処理する方法を変更しました。この結果、SQLサーバーインスタンスまたはサーバーマシンを再起動した後、レコード間のIDギャップを確認できます。このIDギャップには他の理由もあるかもしれません。アップデートをインストールした後の自動サーバー再起動が原因かもしれません。
以下の2つの選択肢を使用できます
NO CACHE設定でシーケンスジェネレーターを使用する
ここで期待しているSQL Server 2012でのトレースフラグ272の設定
「SQL Server構成マネージャー」を開きます
この接続項目へのコメントに説明があると思います。 フェールオーバーまたは再起動の結果、IDが再シードされます
ハイエンドマシンのパフォーマンスを向上させるために、2012年にID値の事前割り当てを導入しました。また、TF 272を使用してこの機能を無効にできます(その後、2008R2から動作を取得できます)。
IDプロパティは、メタデータに個別に保存されます。値がIDで使用され、incrementが呼び出されると、新しいシード値が設定されます。ロールバック、フェイルオーバーなどの操作は、DBCC再シード以外のシード値を変更できません。フェールオーバーはテーブルオブジェクトに適用されますが、IDオブジェクトには適用されません。そのため、フェールオーバーの場合、手動フェールオーバーの前にチェックポイントを呼び出すことができますが、計画外のケースではギャップが生じる場合があります。ギャップが懸念される場合は、TF 272を使用することをお勧めします。
コントロールマネージャーのシャットダウンについては、次のバージョン(別のTFを含む)の修正プログラムがあります。この修正により、ほとんどのコントロールマネージャーのシャットダウンケースが処理されます。
代わりにシーケンスを使用することもできます。シーケンスを使用すると、100%完全に制御でき、アイデンティティと比較して多くの点ではるかに優れています。アイデンティティは非常に簡単で便利です。
http://msdn.Microsoft.com/en-us/library/ff878091.aspx
私の知る限り、IDを挿入して失敗すると、とにかくIDが使用されますが、 検証済み
シーケンスを使用すると、サイクルを使用してギャップを「埋める」ことができます。ただし、Amy Barrettが指摘しているように、これはトランザクションの範囲外で作成されます。
キャッシュを使用している場合、パフォーマンスが最適化されますが、これも有用です。