Porovnání hodnoty GUID a uniqueidentifier
Datový typ globálně jedinečného identifikátoru (GUID) v SQL Serveru je reprezentován datovým typem uniqueidentifier
, který ukládá binární hodnotu 16 bajtů. Identifikátor GUID je binární číslo a jeho hlavní použití je jako identifikátor, který musí být jedinečný v síti, která má mnoho počítačů v mnoha lokalitách. Identifikátory GUID je možné generovat voláním funkce Transact-SQL NEWID a je zaručeno, že budou jedinečné po celém světě. Další informace naleznete v tématu uniqueidentifier (Transact-SQL).
Práce s hodnotami SqlGuid
Vzhledem k tomu, že hodnoty identifikátorů GUID jsou dlouhé a nejasné, nejsou pro uživatele smysluplné. Pokud se pro klíčové hodnoty používají náhodně generované identifikátory GUID a vy vložíte velké množství řádků, získáte do indexů náhodné vstupně-výstupní operace, které můžou negativně ovlivnit výkon. Identifikátory GUID jsou také relativně velké ve srovnání s jinými datovými typy. Obecně doporučujeme používat identifikátory GUID pouze pro velmi úzké scénáře, pro které není vhodný žádný jiný datový typ.
Porovnání hodnot GUID
Relační operátory lze použít s uniqueidentifier
hodnotami. Řazení ale není implementováno porovnáním bitových vzorů dvou hodnot. Jedinými operacemi, které jsou povoleny vůči hodnotěuniqueidentifier
, jsou porovnání (=, <>, , <, ><=, >=) a kontrola hodnoty NULL (IS NULL a IS NOT NULL). Nejsou povoleny žádné další aritmetické operátory.
Obě Guid a SqlGuid mají metodu CompareTo
pro porovnání různých hodnot GUID. System.Guid.CompareTo
SqlTypes.SqlGuid.CompareTo
Jsou však implementovány odlišně. SqlGuid implementuje CompareTo
pomocí chování SQL Serveru, v posledních šesti bajtech hodnoty jsou nejvýznamnější. Guid vyhodnotí všech 16 bajtů. Následující příklad ukazuje tento rozdíl chování. První část kódu zobrazuje neseřazené hodnoty a druhá část kódu zobrazuje seřazené Guid Guid hodnoty. Třetí část zobrazuje seřazené SqlGuid hodnoty. Výstup se zobrazí pod výpisem kódu.
static void WorkWithGuids()
{
// Create an ArrayList and fill it with Guid values.
ArrayList guidList = new()
{
new Guid("3AAAAAAA-BBBB-CCCC-DDDD-2EEEEEEEEEEE"),
new Guid("2AAAAAAA-BBBB-CCCC-DDDD-1EEEEEEEEEEE"),
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()
{
new SqlGuid("3AAAAAAA-BBBB-CCCC-DDDD-2EEEEEEEEEEE"),
new SqlGuid("2AAAAAAA-BBBB-CCCC-DDDD-1EEEEEEEEEEE"),
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
Tento příklad vytvoří následující výsledky.
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