一部のテーブルで作成された ID が正確に連続していないことがわかり始めました。つまり、それらは段階的に高いままですが、値には大きなギャップがあります.
たとえば、シーケンスは {1,2,3.. .. 97,98,99} で、次に {1092,1093,1094.. .. 1097,1098,1099} にジャンプし、その後に別のギャップが続き、{ 4231,4232,4233.. ..4257,4258,4259}.
誰でもこの動作に光を当てることができますか?
一部のテーブルで作成された ID が正確に連続していないことがわかり始めました。つまり、それらは段階的に高いままですが、値には大きなギャップがあります.
たとえば、シーケンスは {1,2,3.. .. 97,98,99} で、次に {1092,1093,1094.. .. 1097,1098,1099} にジャンプし、その後に別のギャップが続き、{ 4231,4232,4233.. ..4257,4258,4259}.
誰でもこの動作に光を当てることができますか?
ID列のあるテーブルへの挿入を実行し、挿入が失敗した場合(何らかの理由で)、ID値は引き続きインクリメントされ、次の挿入はギャップを残します。また、行を削除すると、明らかにギャップが生じます。
代理キーの実際の値、またはあるテーブルの1つまたは複数の行を別のテーブルの行に接続するための「接続値」以外のIDに依存したり、使用したりしないでください。確かに、値のシーケンスが連続していることや、値が時系列で増加していることに依存することはありません。
これは既知のバグです。大きなギャップは、フェイルオーバー、サービスの再起動、再起動などが原因で発生します。
修正されるまでは、影響を受けるすべてのテーブルのID列を再シードする起動手順がある場合を除いて、それについてできることはほとんどありません。
ID 列を持つテーブルに挿入するたびに、ID がインクリメントされます。行を削除した場合、またはそのテーブルへの挿入をロールバックした場合でも、ID 列は新しい増分のままです。
以下は、トランザクションのロールバックの効果を示すスクリプトです。
create table #temp (TheKey int identity(1,1), TheValue int)
insert into #Temp (TheValue) values (1)
select max(TheKey) from #Temp --1 as expected
begin tran
insert into #Temp (TheValue) values (1)
select max(TheKey) from #Temp --2 as expected
rollback
select max(TheKey) from #Temp --1 as expected
insert into #Temp (TheValue) values (1)
select max(TheKey) from #Temp --3 a little bit of a surprise?
サーバーはパフォーマンスのために値をキャッシュしているように見えるため、たとえば停電後にサーバーがリセットされると、それらの値が失われる可能性があります。この記事を参照してください。