私は、会社が開始している新しいデータベースのデータベース標準を作成しています。私たちが定義しようとしていることの1つは、UniqueIdentifierに関連した主キーおよびクラスタード・インデックスのルールです。UniqueIdentifierのNewSequentialIdクラスター化インデックス
は(注:私は主キーまたはクラスタ化インデックスとしてのUniqueIdentifierを使用しての長所と短所についての議論をしたくないことに関するウェブ上の情報のトンがあります。これは、その議論ないです。。。だからここ)
は私が心配しているシナリオです:
は、私は、クラスタ化インデックスと主キーとしてのUniqueIdentifierを持つテーブルがあるとします。 ColAと呼ぶことができます。 ColAのデフォルト値をNewSequentialId()に設定しました。
{72586AA4-D2C3-440D-A9FE-CC7988DDF065}
{72586AA4-D2C3-440D-A9FE-CC7988DDF066}
{72586AA4-D2C3-:そのNewSequentialId()私は3つの連続行を挿入を使用
440D-A9FE-CC7988DDF067}
次に、サーバーを再起動します。 docs for NewSequentialIdは、「Windowsを再起動すると、GUIDは低い範囲から再開できますが、依然としてグローバルに一意です」と述べています。
したがって、次の開始点は前の範囲よりも低くなる可能性があります。
{35729A0C-F016-4645-ABA9-B098D2003E64}
{35729A0C-F016-4645-ABA9-B098D2003E65}
{35729A0C-F016-:
そこで再起動後、私は3つの以上の値を挿入します4645-ABA9-B098D2003E66}
(私はguidがデータベースにどのように表現されているかわかりませんが、これは3で始まり、前のものは7で始まり、3は3より小さい7つのもの。)
クラスタード・インデックスの途中で、インデックスの再マッピングが行われなければなりません。 (少なくとも私のDBAは私に言いました。)そして再起動するたびに、私は新しいUniqueIdentifierの範囲を他の以前の範囲の真ん中にするリスクがあります。
私の質問は次のUniqueIdentifierのセットが最後のセットよりも小さいため、すべての挿入によってクラスタ化されたインデックスがシャッフルされますか?
もしそうでなければ、なぜですか? SQL ServerはNewSequentialIdを使用していることを知っていますか?それを補う方法はいくつかありますか?
もしそうでなければ、私は次に何を挿入するかをどのように知っていますか?多分、次の100万人のインサートが3で始まるでしょう。あるいは、彼らは7で始まるかもしれません。それはどうやって知っていますか?
それはわかりませんが、すべてを順番に保ちます。この場合、再起動するとパフォーマンスが大幅に低下する可能性があります。 (再起動の影響を受けない独自のカスタムNewSequentialIdが必要だと思うのですが)それは正しいのですか?それとも私が気づいていない魔法がいくつかありますか?
EDIT:クラスタ化インデックスとしてのGUIDは、私の標準ではお勧めできません。私が上記のように、これは悪い考えである多くの理由があります。私はこれが別の理由であるかどうかを調べようとしています。
"そうであれば、1回の再起動でパフォーマンスが大幅に低下する可能性があります。"つまり、IDENTITY()を使用したいのですが、それを聞きたくないのです。 – HardCode