0

クラスター化インデックスを持つ列でランダムな値を使用することはお勧めできないことはよく知られています。そのため、クラスター化インデックスを持つ主キーに GUID を使用することは通常はお勧めできません。newsequentialid() 関数を使用すると、これらの問題のほとんどを克服できます。

しかし、Web サーバーのファームで GUID を生成し、すべて同じデータベースにアクセスするとどうなるでしょうか? この記事で説明されているように、UuidCreateSequential を使用して .NET コードでシーケンシャル ID を作成しています 。 -sql-server-in-net.aspx

問題は、結果として得られる GUID が 1 台のマシンから連続している場合でも、複数のマシンでは同じようにならないことです。最上位の 11 バイト (SQL Server によると) は、同じマシンではほぼ同じままであるように見えるため、望ましい逆ではなく、効果的にマシン、次に時間でソートされます。

GUID 内のバイトを並べ替えてマシン間でほぼ連続した GUID を取得することは価値があり実行可能でしょうか? それともあきらめてインデックスを非クラスター化する必要がありますか?

ありがとう!

4

2 に答える 2

1

これを試した後、私は自分の質問に答えて、質問で説明されているように複数のマシンから順次 GUID (COMB GUID) を生成することは問題ではないと言います。基本的に、マシンごとに 1 つの個別の ID シーケンスがあり、ページの途中ではなく、異なるページの最後に追加されるため、ページ分割は発生しません (新しい ID は常に最大になるため)。その順序で)。

GUID は int ほど効率的ではないかもしれませんが、テーブルごとに数百万行のこのアプローチを使用しても問題はありませんでした。

于 2016-08-14T00:39:51.023 に答える
0

C# で ID を生成することもできます。コード プロジェクトに関するこの投稿を参照してください。私の目標は、C# コードが最後の 6 を生成することだったので、この実装によって生成されたコードは NEWSEQUENTIALID が生成したものと一致しないということです。 Guid のバイトを Sql サーバーの NewSequentialID 関数として使用すると、次のコードになります。

public static Guid ToSequentialAtEnd(this Guid guid)
{
    byte[] guidArray = guid.ToByteArray();

    DateTime now = DateTime.UtcNow;
    var baseDate = new DateTime(1900, 1, 1);

    // Get the days and milliseconds which will be used to build the byte string 
    var days = new TimeSpan(now.Ticks - baseDate.Ticks);
    TimeSpan msecs = now.TimeOfDay;

    // Convert to a byte array 
    // Note that SQL Server is accurate to 1/300th of a millisecond so we divide by 3.33333333 
    byte[] daysArray = BitConverter.GetBytes(days.Days);
    byte[] msecsArray = BitConverter.GetBytes((long)(msecs.TotalMilliseconds / 3.33333333));

    // Reverse the bytes to match SQL Servers ordering 
    Array.Reverse(daysArray);
    Array.Reverse(msecsArray);

    // Copy the bytes into the guid 
    Array.Copy(daysArray, daysArray.Length - 2, guidArray, guidArray.Length - 6, 2);
    Array.Copy(msecsArray, msecsArray.Length - 4, guidArray, guidArray.Length - 4, 4);

    return new Guid(guidArray);
}
于 2016-08-15T19:27:20.210 に答える