GUID と uniqueidentifier 値の比較 (ADO.NET)
更新 : November 2007
SQL Server のグローバル一意識別子 (GUID: Globally Unique Identifier) データ型は、16 バイトのバイナリ値を格納する uniqueidentifier データ型で表現されます。GUID は、2 進数の値です。GUID は主に、多数のコンピュータが多数のサイトに存在するネットワーク内で、一意である必要のある識別子として使用されます。GUID は、Transact-SQL NEWID 関数を呼び出すことにより生成され、世界中のコンピュータの中で一意であることが保証されています。詳細については、SQL Server オンライン ブックの「uniqueidentifier データの使用」を参照してください。
SqlGuid 値の使用
GUID の値は長くて不可解な値であるため、ユーザーには意味がわかりません。ランダムに生成された GUID をキー値として使用して多数の行を挿入した場合に、ランダムな I/O をインデックスにすると、パフォーマンスに悪影響を及ぼします。また、GUID は、その他のデータ型に比べてサイズが大きくなります。通常、GUID は、その他のデータ型が適さないような非常に限られた場合にのみ使用することをお勧めします。
GUID 値の比較
uniqueidentifier 型の値には比較演算子が使用できます。ただし、順序付けは、2 つの値のビット パターンの比較によっては実装されません。uniqueidentifier 値に対して実行可能な唯一の操作は、比較 (=、<>、<、>、<=、>=) と NULL の確認 (IS NULL および IS NOT NULL) です。これ以外の算術演算子を使用することはできません。
Guid と SqlGuid のいずれも、異なる GUID 値を比較するための CompareTo メソッドを持っています。ただし、System.Guid.CompareTo と SqlTypes.SqlGuid.CompareTo では実装方法が異なります。SqlGuid は、値の末尾 6 バイトのみを評価する SQL Server の動作に従って CompareTo を実装します。Guid は 16 バイトすべてを評価します。次の例は、この動作の違いを示しています。コードの最初のセクションは、並べ替えられていない Guid 値を表示し、コードの 2 つ目のセクションは、並べ替えられた Guid 値を示します。3 つ目のセクションは、並べ替えられた SqlGuid 値を示します。出力は、コードの一覧の下に表示されます。
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
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);
}
}
この例を実行すると、次の結果が得られます。
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