58

SQLサーバー2012(デナリ)を使用しています。すべての ID 列の値が 1001 などから始まるのはなぜだろうか。最初のIdentity列は 1、2 などから始まり、id をスムーズに追加しますが、突然、identity 列を含むデータベース内のすべてのテーブルに対して 1001、1002 以降にジャンプします。その理由は何ですか?手伝ってください。

4

3 に答える 3

82

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」と入力します

  • 「追加」をクリック

  • 変更を確認する

于 2013-07-11T10:55:15.520 に答える
1

代わりにシーケンスを使用できると思います.シーケンスは100%完全に制御でき、多くの点でIDと比較してはるかに優れています.IDは非常に簡単で便利です.

http://msdn.microsoft.com/en-us/library/ff878091.aspx

私の知る限り、アイデンティティを使用して挿入して失敗すると、とにかくアイデンティティが使用され、検証済み

シーケンスを使用すると、サイクルを使用してギャップを「埋める」ことができます。ただし、Amy Barrett が指摘しているように、これはトランザクションの範囲外で作成されます。

同様に役立つキャッシュを使用している場合のパフォーマンスの最適化があります。

于 2013-07-11T10:55:10.637 に答える