SQLサーバー2012(デナリ)を使用しています。すべての ID 列の値が 1001 などから始まるのはなぜだろうか。最初のIdentity
列は 1、2 などから始まり、id をスムーズに追加しますが、突然、identity 列を含むデータベース内のすべてのテーブルに対して 1001、1002 以降にジャンプします。その理由は何ですか?手伝ってください。
3 に答える
Microsoft は、SQL Server 2012 で ID 値を処理する方法を変更しました。その結果、SQL サーバー インスタンスまたはサーバー マシンを再起動した後、レコード間に ID のギャップが見られることがあります。この ID ギャップには他にもいくつかの理由がある可能性があります。更新プログラムのインストール後のサーバーの自動再起動が原因である可能性があります。
以下の2つの選択肢を使用できます
トレース フラグ 272 を使用 o これにより、生成された ID 値ごとにログ レコードが生成されます。このトレース フラグをオンにすると、ID 生成のパフォーマンスが影響を受ける場合があります。
NO CACHE 設定でシーケンス ジェネレーターを使用する
ここで期待している SQL Server 2012 でトレース フラグ 272 を設定する
「SQL Server 構成マネージャー」を開きます
左ペインの「SQL Server サービス」をクリックします
右側のペインで SQL Server インスタンス名を右クリック -> デフォルト: SQL Server(MSSQLSERVER)
「プロパティ」をクリック
「起動パラメータ」をクリック
「スタートアップパラメータを指定する」テキストボックスに「-T272」と入力します
「追加」をクリック
変更を確認する
代わりにシーケンスを使用できると思います.シーケンスは100%完全に制御でき、多くの点でIDと比較してはるかに優れています.IDは非常に簡単で便利です.
http://msdn.microsoft.com/en-us/library/ff878091.aspx
私の知る限り、アイデンティティを使用して挿入して失敗すると、とにかくアイデンティティが使用され、検証済み
シーケンスを使用すると、サイクルを使用してギャップを「埋める」ことができます。ただし、Amy Barrett が指摘しているように、これはトランザクションの範囲外で作成されます。
同様に役立つキャッシュを使用している場合のパフォーマンスの最適化があります。