GUID と uniqueidentifier 値の比較Comparing GUID and uniqueidentifier Values

SQL Server のグローバル一意識別子 (GUID: Globally Unique Identifier) データ型は、16 バイトのバイナリ値を格納する uniqueidentifier データ型で表現されます。The globally unique identifier (GUID) data type in SQL Server is represented by the uniqueidentifier data type, which stores a 16-byte binary value. GUID はバイナリ数値であり、多くのサイトの多くのコンピューターがあるネットワーク内で一意にする必要がある識別子として主に使用されます。A GUID is a binary number, and its main use is as an identifier that must be unique in a network that has many computers at many sites. GUID は、Transact-SQL NEWID 関数を呼び出して生成でき、全世界で一意であることが保証されます。GUIDs can be generated by calling the Transact-SQL NEWID function, and is guaranteed to be unique throughout the world. 詳細については、「uniqueidentifier (Transact-SQL)」を参照してください。For more information, see uniqueidentifier (Transact-SQL).

SqlGuid 値の使用Working with SqlGuid Values

GUID の値は長くて不可解な値であるため、ユーザーには意味がわかりません。Because GUIDs values are long and obscure, they are not meaningful for users. キー値にランダムに生成された GUID を使用しており、大量の行を挿入した場合、インデックスにランダムな I/O が取り込まれるため、パフォーマンスが低下する可能性があります。If randomly generated GUIDs are used for key values and you insert a lot of rows, you get random I/O into your indexes, which can negatively impact performance. GUID はさらに、他のデータ型と比較すると比較的大きいものになります。GUIDs are also relatively large when compared to other data types. 通常、GUID は、その他のデータ型が適さないような非常に限られた場合にのみ使用することをお勧めします。In general we recommend using GUIDs only for very narrow scenarios for which no other data type is suitable.

GUID 値の比較Comparing GUID Values

uniqueidentifier 型の値には比較演算子が使用できます。Comparison operators can be used with uniqueidentifier values. ただし、順序付けは、2 つの値のビット パターンの比較によっては実装されません。However, ordering is not implemented by comparing the bit patterns of the two values. uniqueidentifier 値に対して実行可能な唯一の操作は、比較 (=、<>、<, >、<=, >=) と NULL の確認 (IS NULL および IS NOT NULL) です。The only operations that are allowed against a uniqueidentifier value are comparisons (=, <>, <, >, <=, >=) and checking for NULL (IS NULL and IS NOT NULL). これ以外の算術演算子を使用することはできません。No other arithmetic operators are allowed.

GuidSqlGuid はどちらにも、異なる GUID 値を比較するための CompareTo メソッドがあります。Both Guid and SqlGuid have a CompareTo method for comparing different GUID values. ただし、System.Guid.CompareToSqlTypes.SqlGuid.CompareTo の実装方法は異なります。However, System.Guid.CompareTo and SqlTypes.SqlGuid.CompareTo are implemented differently. SqlGuid は SQL Server の動作を使用して CompareTo を実装し、値の最後の 6 バイトが最も重要になります。SqlGuid implements CompareTo using SQL Server behavior, in the last six bytes of a value are most significant. Guid は 16 バイトすべてを評価します。Guid evaluates all 16 bytes. 次の例は、この動作の違いを示しています。The following example demonstrates this behavioral difference. コードの最初のセクションは、並べ替えられていない Guid 値を示しており、コードの 2 番目のセクションは並べ替えられた Guid 値を示しています。The first section of code displays unsorted Guid values, and the second section of code shows the sorted Guid values. 3 番目のセクションは、並べ替えられた SqlGuid 値を示しています。The third section shows the sorted SqlGuid values. コード リストの下に出力を示しています。The output is displayed beneath the code listing.

private static void WorkWithGuids()
{
    // Create an ArrayList and fill it with Guid values.
    ArrayList guidList = new ArrayList();
    guidList.Add(new Guid("3AAAAAAA-BBBB-CCCC-DDDD-2EEEEEEEEEEE"));
    guidList.Add(new Guid("2AAAAAAA-BBBB-CCCC-DDDD-1EEEEEEEEEEE"));
    guidList.Add(new Guid("1AAAAAAA-BBBB-CCCC-DDDD-3EEEEEEEEEEE"));

    // Display the unsorted Guid values.
    Console.WriteLine("Unsorted Guids:");
    foreach (Guid guidValue in guidList)
    {
        Console.WriteLine(" {0}", guidValue);
    }
    Console.WriteLine("");

    // Sort the Guids.
    guidList.Sort();

    // Display the sorted Guid values.
    Console.WriteLine("Sorted Guids:");
    foreach (Guid guidSorted in guidList)
    {
        Console.WriteLine(" {0}", guidSorted);
    }
    Console.WriteLine("");

    // Create an ArrayList of SqlGuids.
    ArrayList sqlGuidList = new ArrayList();
    sqlGuidList.Add(new SqlGuid("3AAAAAAA-BBBB-CCCC-DDDD-2EEEEEEEEEEE"));
    sqlGuidList.Add(new SqlGuid("2AAAAAAA-BBBB-CCCC-DDDD-1EEEEEEEEEEE"));
    sqlGuidList.Add(new SqlGuid("1AAAAAAA-BBBB-CCCC-DDDD-3EEEEEEEEEEE"));

    // Sort the SqlGuids. The unsorted SqlGuids are in the same order
    // as the unsorted Guid values.
    sqlGuidList.Sort();

    // Display the sorted SqlGuids. The sorted SqlGuid values are ordered
    // differently than the Guid values.
    Console.WriteLine("Sorted SqlGuids:");
    foreach (SqlGuid sqlGuidValue in sqlGuidList)
    {
        Console.WriteLine(" {0}", sqlGuidValue);
    }
}
Private Sub WorkWithGuids()

    ' Create an ArrayList and fill it with Guid values.
    Dim guidList As New ArrayList()
    guidList.Add(New Guid("3AAAAAAA-BBBB-CCCC-DDDD-2EEEEEEEEEEE"))
    guidList.Add(New Guid("2AAAAAAA-BBBB-CCCC-DDDD-1EEEEEEEEEEE"))
    guidList.Add(New Guid("1AAAAAAA-BBBB-CCCC-DDDD-3EEEEEEEEEEE"))

    ' Display the unsorted Guid values.
    Console.WriteLine("Unsorted Guids:")
    For Each guidValue As Guid In guidList
        Console.WriteLine("{0}", guidValue)
    Next
    Console.WriteLine()

    ' Sort the Guids.
    guidList.Sort()

    ' Display the sorted Guid values.

    Console.WriteLine("Sorted Guids:")
    For Each guidSorted As Guid In guidList
        Console.WriteLine("{0}", guidSorted)
    Next
    Console.WriteLine()

    ' Create an ArrayList of SqlGuids.
    Dim sqlGuidList As New ArrayList()
    sqlGuidList.Add(New SqlGuid("3AAAAAAA-BBBB-CCCC-DDDD-2EEEEEEEEEEE"))
    sqlGuidList.Add(New SqlGuid("2AAAAAAA-BBBB-CCCC-DDDD-1EEEEEEEEEEE"))
    sqlGuidList.Add(New SqlGuid("1AAAAAAA-BBBB-CCCC-DDDD-3EEEEEEEEEEE"))

    ' Sort the SqlGuids. The unsorted SqlGuids are in the same order
    ' as the unsorted Guid values.
    sqlGuidList.Sort()

    ' Display the sorted SqlGuids. The sorted SqlGuid values are 
    ' ordered differently than the Guid values.
    Console.WriteLine("Sorted SqlGuids:")
    For Each sqlGuidValue As SqlGuid In sqlGuidList
        Console.WriteLine("{0}", sqlGuidValue)
    Next
End Sub

この例を実行すると、次の結果が得られます。This example produces the following results.

Unsorted Guids:  
3aaaaaaa-bbbb-cccc-dddd-2eeeeeeeeeee  
2aaaaaaa-bbbb-cccc-dddd-1eeeeeeeeeee  
1aaaaaaa-bbbb-cccc-dddd-3eeeeeeeeeee  
  
Sorted Guids:  
1aaaaaaa-bbbb-cccc-dddd-3eeeeeeeeeee  
2aaaaaaa-bbbb-cccc-dddd-1eeeeeeeeeee  
3aaaaaaa-bbbb-cccc-dddd-2eeeeeeeeeee  
  
Sorted SqlGuids:  
2aaaaaaa-bbbb-cccc-dddd-1eeeeeeeeeee  
3aaaaaaa-bbbb-cccc-dddd-2eeeeeeeeeee  
1aaaaaaa-bbbb-cccc-dddd-3eeeeeeeeeee  

関連項目See also