【SQLServer2012】IDENTITY 設定した値が不自然な増加

SQLServer2012でIDENTITYで採番しているフィールドのインクリメントが
おかしくなる件。
意図しない番号増が発生します。。

同じことを2008、2014で試してみたけど再現しませんでした。

T007

id・・・Numeric(18,0) ID ENTITY  にしておいて…

T001
このテーブルに対してInsertを実行。IDENTITYの値を取得。( SELECT SCOPE_IDENTITY() の方がいいんだけど…w)
1がとれます。

T002
もう1回やると…
2になります。

T003
ここでSQLServerのサービスを再起動。

T004
再度Insertを実行すると…
取得した値は 10002…  急に10000も増えました。

T005
再度サービス再起動からのInsert実行で…
さらに10000増加してしまいました。

T006

当然テーブルの中身を見るとこんな感じ。

この時にSELECT IDENT_CURRENT(‘Table_1’) as ID でIDを取得すると
サービス再起動前は 20002 で この状態で再起動すると 30002 に。

一気に10000増加するとか本当に困ります。

このへんで同じような情報もありました。

これ読むと

    サーバーの再起動または他のエラーが発生した後の連続した値: SQL Server では、パフォーマンス上の理由から ID 値をキャッシュすることがあります。割り当てられた値の一部は、データベースの障害やサーバーの再起動が発生したときに失われることがあります。 その結果、挿入時に非連続的な ID 値が生成される場合があります。 非連続的な値が許可されない場合、アプリケーションでは、シーケンス ジェネレーターを NOCACHE オプションを指定して使用するか独自のメカニズムを使用して、キー値を生成する必要があります。

ってありますが…。

シーケンステーブル作ってやった方がいいのかしら。。

<追記>
IDENTITY プロパティ使用時の動作について
MS サポートブログに載ってました。
Bigintの場合に10000キャッシュされるようですね。。
仕様か。。

コメント

タイトルとURLをコピーしました