Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server-GUID-Sortieralgorithmus. Wieso den?

Der Algorithmus wird von den SQL Server-Jungs hier dokumentiert:Wie werden GUIDs in SQL Server 2005 verglichen? Ich zitiere hier hier (da es sich um einen alten Artikel handelt, der in ein paar Jahren für immer verschwunden sein könnte)

Im Allgemeinen sind Gleichheitsvergleiche mit eindeutigen Identifikatorwerten sehr sinnvoll. Wenn Sie jedoch feststellen, dass Sie eine allgemeine Sortierung benötigen, suchen Sie möglicherweise nach dem falschen Datentyp und sollten stattdessen verschiedene Integer-Typen in Betracht ziehen.

Wenn Sie sich nach sorgfältiger Überlegung entscheiden, auf einer Uniqueidentifier-Spalte zu bestellen, werden Sie vielleicht überrascht sein, was Sie zurückbekommen.

Gegeben sind diese beiden uniqueidentifier-Werte:

@g1='55666BEE-B3A0-4BF5-81A7-86FF976E763F' @g2 ='8DD5BCA5-6ABE-4F73-B4B7-393AE6BBB849'

Viele Leute denken, dass @g1 kleiner als @g2 ist, da '55666BEE' sicherlich kleiner als '8DD5BCA5' ist. Auf diese Weise vergleicht SQL Server2005 jedoch nicht uniqueidentifier-Werte.

Der Vergleich wird durchgeführt, indem Byte-"Gruppen" von rechts nach links und von links nach rechts innerhalb einer Byte-"Gruppe" betrachtet werden. Eine Bytegruppe wird durch das Zeichen „-“ begrenzt. Technisch gesehen betrachten wir zuerst die Bytes {10 bis 15}, dann {8-9}, dann {6-7}, dann {4-5} und zuletzt {0 bis 3}.

In diesem speziellen Beispiel würden wir damit beginnen, „86FF976E763F“ mit „393AE6BBB849“ zu vergleichen. Wir sehen sofort, dass @g2 tatsächlich größer als @g1 ist.

Beachten Sie, dass Guid-Werte in .NET-Sprachen eine andere Standardsortierreihenfolge haben als in SQL Server. Wenn Sie feststellen, dass Sie ein Array oder eine Liste von Guid mithilfe der SQL Server-Vergleichssemantik anordnen müssen, können Sie stattdessen ein Array oder eine Liste von SqlGuid verwenden, wodurch IComparable in Away implementiert wird, was mit der SQL Server-Semantik konsistent ist.

Außerdem folgt die Sortierung der Bytegruppen-Endianness (siehe hier:Globally Unique Identifier). Die Gruppen 10-15 und 8-9 werden als Big Endian gespeichert (entsprechend der Data4 im Wikipedia-Artikel), also werden sie als Big Endian verglichen. Andere Gruppen werden mit Little Endian verglichen.