Porównywanie identyfikatora GUID i wartości uniqueidentifier
Typ danych identyfikatora globalnego (GUID) w programie SQL Server jest reprezentowany przez uniqueidentifier
typ danych, który przechowuje 16-bajtową wartość binarną. Identyfikator GUID jest liczbą binarną, a jej głównym zastosowaniem jest identyfikator, który musi być unikatowy w sieci, która ma wiele komputerów w wielu lokacjach. Identyfikatory GUID można wygenerować przez wywołanie funkcji Transact-SQL NEWID i gwarantuje, że będą unikatowe na całym świecie. Aby uzyskać więcej informacji, zobacz uniqueidentifier (Transact-SQL).
Praca z wartościami SqlGuid
Ponieważ wartości identyfikatorów GUID są długie i niejasne, nie mają znaczenia dla użytkowników. Jeśli losowo generowane identyfikatory GUID są używane dla wartości klucza i wstawiasz wiele wierszy, do indeksów uzyskasz losowe operacje we/wy, co może negatywnie wpłynąć na wydajność. Identyfikatory GUID są również stosunkowo duże w porównaniu z innymi typami danych. Ogólnie rzecz biorąc, zalecamy używanie identyfikatorów GUID tylko w przypadku bardzo wąskich scenariuszy, dla których żaden inny typ danych nie jest odpowiedni.
Porównywanie wartości identyfikatora GUID
Operatory porównania mogą być używane z wartościami uniqueidentifier
. Jednak kolejność nie jest implementowana przez porównanie wzorców bitowych dwóch wartości. Jedynymi operacjami, które są dozwolone względem uniqueidentifier
wartości, są porównania (=, <>, ><<= , =, >=) i sprawdzanie wartości NULL (IS NULL i IS NOT NULL). Żadne inne operatory arytmetyczne nie są dozwolone.
Obie Guid metody i SqlGuid mają metodę CompareTo
porównywania różnych wartości identyfikatora GUID. System.Guid.CompareTo
Jednak i SqlTypes.SqlGuid.CompareTo
są implementowane inaczej. SqlGuid implementacje CompareTo
przy użyciu zachowania programu SQL Server, w ciągu ostatnich sześciu bajtów wartości są najważniejsze. Guid oblicza wszystkie 16 bajtów. W poniższym przykładzie pokazano tę różnicę behawioralną. Pierwsza sekcja kodu zawiera niesortowane wartości, a druga sekcja kodu przedstawia posortowane Guid Guid wartości. W trzeciej sekcji przedstawiono posortowane SqlGuid wartości. Dane wyjściowe są wyświetlane pod listą kodu.
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
W tym przykładzie są generowane następujące wyniki.
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