web-dev-qa-db-ja.com

SQL ServerでID列の値が突然1001にジャンプする

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

47
Rajaram Shelar

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」と入力します
  • 「追加」をクリックします
  • 変更を確認する
73
Kitty

この接続項目へのコメントに説明があると思います。 フェールオーバーまたは再起動の結果、IDが再シードされます

ハイエンドマシンのパフォーマンスを向上させるために、2012年にID値の事前割り当てを導入しました。また、TF 272を使用してこの機能を無効にできます(その後、2008R2から動作を取得できます)。

IDプロパティは、メタデータに個別に保存されます。値がIDで使用され、incrementが呼び出されると、新しいシード値が設定されます。ロールバック、フェイルオーバーなどの操作は、DBCC再シード以外のシード値を変更できません。フェールオーバーはテーブルオブジェクトに適用されますが、IDオブジェクトには適用されません。そのため、フェールオーバーの場合、手動フェールオーバーの前にチェックポイントを呼び出すことができますが、計画外のケースではギャップが生じる場合があります。ギャップが懸念される場合は、TF 272を使用することをお勧めします。

コントロールマネージャーのシャットダウンについては、次のバージョン(別のTFを含む)の修正プログラムがあります。この修正により、ほとんどのコントロールマネージャーのシャットダウンケースが処理されます。

12
Mikael Eriksson

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

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

私の知る限り、IDを挿入して失敗すると、とにかくIDが使用されますが、 検証済み

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

キャッシュを使用している場合、パフォーマンスが最適化されますが、これも有用です。

1