Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Algorithme de tri du GUID SQL Server. Pourquoi?

L'algorithme est documenté par les gars de SQL Server ici :Comment les GUID sont-ils comparés dans SQL Server 2005 ? Je cite ici ici (puisque c'est un vieil article qui aura peut-être disparu à jamais dans quelques années)

En général, les comparaisons d'égalité ont beaucoup de sens avec les valeurs d'identificateur unique. Cependant, si vous avez besoin d'un ordre général, vous vous trompez peut-être de type de données et devriez plutôt envisager différents types d'entiers.

Si, après mûre réflexion, vous décidez de commander sur une colonne uniqueidentifier, vous pourriez être surpris par ce que vous obtenez en retour.

Étant donné ces deux valeurs d'identifiant unique :

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

Beaucoup de gens pensent que @g1 est inférieur à @g2, puisque '55666BEE' est certainement plus petit que '8DD5BCA5'. Cependant, ce n'est pas ainsi que SQL Server2005 compare les valeurs d'uniqueidentifier.

La comparaison est effectuée en examinant les "groupes" d'octets de droite à gauche et de gauche à droite à l'intérieur d'un "groupe" d'octets. Un groupe d'octets est ce qui est délimité par le caractère '-'. Plus techniquement, nous examinons d'abord les octets {10 à 15}, puis {8-9}, puis {6-7}, puis {4-5} et enfin {0 à 3}.

Dans cet exemple spécifique, nous commencerions par comparer '86FF976E763F' avec '393AE6BBB849'. Nous voyons immédiatement que @g2 est en effet supérieur à @g1.

Notez que dans les langages .NET, les valeurs Guid ont un ordre de tri par défaut différent de celui de SQL Server. Si vous avez besoin de commander un tableau ou une liste de Guid à l'aide de la sémantique de comparaison SQL Server, vous pouvez utiliser un tableau ou une liste de SqlGuid à la place, qui implémente IComparable de manière cohérente avec la sémantique de SQL Server.

De plus, le tri suit l'endianité des groupes d'octets (voir ici :Identifiant global unique). Les groupes 10-15 et 8-9 sont stockés en big endian (correspondant au Data4 dans l'article wikipedia), ils sont donc comparés en big endian. D'autres groupes sont comparés à l'aide de Little Endian.