2

MSSQL Server 2005 に 2 列の小さなテーブルがあり、そこには大量の情報 (約 10 億レコードとしましょう) が含まれており、常に書き込まれています。

テーブルの定義は次のとおりです。

Create table Test(
id int identity(1,1) primary key ,
name varchar(30) )

Te PK は int であり、いくつかの理由で uniqueidentifier よりも選択します。この問題は、行が削除されるたびに「id」を再編成したい自動インクリメントに伴います。これの目的は、ギャップを残さないことです。テーブルはアクティブで、多くの行が書き込まれているため、列を削除することはオプションではなく、テーブルを長時間ロックします。

私が達成したいことの簡単な例:

私はこれを持っています:

id  | name
----+-------
 1  | Roy 
 2  | Boss 
 5  | Jane 
 7  | Janet

私はそれを再編成したいので、次のようになります。

id  | name
----+-------
 1  | Roy
 2  | Boss
 3  | Jane
 4  | Janet

DBCC CHECKIDENT (TableName, RESEED, position) を認識していますが、テーブルが大きく、間違っていなければテーブルをロックするため、再配置に多くの時間がかかるため、それが私の場合に役立つかどうかはわかりません非常に長い間。このテーブルは他のテーブルでは使用されません。ただし、必要に応じて、テーブルが他のテーブルで使用されていることを念頭に置いて、同じ問題に対する提案を送信できます。

編集1:

目的は、行が削除された場合に行が互いに続くことを証明することです。これにより、行が削除されたことを確認して元に戻すことができます。上の行からのハッシュ値を含む 3 番目の列を追加することを考えていました。上の行が削除されている場合、ギャップがあり、それを復元する必要があることがわかります。その場合、コードを比較して一致するかどうかを確認できるため、順序は重要ではありません。したがって、どの行がどの行に続くかを確認できます。これを行うためのより巧妙で安全な方法があるのだろうか?おそらく、ハッシュコードではなく何か他のもの、行が互いに続くこと、または新しい行に前の行の一部が含まれていることを証明する他の方法が含まれるでしょうか?

編集2:

うまく説明できない場合は、もう一度説明します。時間を無駄にしたくありません。

完璧なケースのシナリオでは、このテーブルから欠落しているものは何もありませんが、サーバー エラーにより、一部のデータが削除されるか、または私の仲間の一部が無駄になり、誤って削除する可能性があります。
ログがあり、そのデータを回復できますが、サーバーエラーが発生し、それらの一部が削除されたが後で復元された場合でも、レコードが順序付けられていることを証明したいと思います. これを行う方法はありますか?

例: 7 が削除され、その後 23 として復元されたとしましょう。23 が 7 であること、つまり 23 が 6 の後で 8 の前にあることをどのように証明しますか?

4

3 に答える 3

5

列を再シードしようとすることを心配しないことをお勧めしIdentityます.SQL Serverが各行の一意性を維持できるようにします.

通常、これは代わりにプレゼンテーション ロジックに必要であり、その場合はROW_NUMBER()分析関数を使用できます。

SELECT Row_Number() Over (Order By Id) NewId,
  Id, Name
FROM YourTable
于 2013-06-03T13:42:09.970 に答える