Сравнение значений идентификатора GUID и uniqueidentifierComparing GUID and uniqueidentifier Values

Тип данных идентификатора GUID в SQL Server представлен типом данных uniqueidentifier, который хранит 16-байтовое двоичное значение.The globally unique identifier (GUID) data type in SQL Server is represented by the uniqueidentifier data type, which stores a 16-byte binary value. Идентификатор GUID - это двоичное число, главным образом используемое для назначения идентификаторов, которые должны быть уникальными в рамках сети с большим числом компьютеров в различных расположениях.A GUID is a binary number, and its main use is as an identifier that must be unique in a network that has many computers at many sites. Идентификаторы GUID можно создавать путем вызова функции Transact-SQL NEWID, они гарантированно будут уникальными в любом расположении.GUIDs can be generated by calling the Transact-SQL NEWID function, and is guaranteed to be unique throughout the world. Дополнительные сведения см. в разделе uniqueidentifier (Transact-SQL).For more information, see uniqueidentifier (Transact-SQL).

Работа со значениями SqlGuidWorking with SqlGuid Values

Так как значения GUID являются длинными и непрозрачными, они не несут никакой смысловой нагрузки для пользователей.Because GUIDs values are long and obscure, they are not meaningful for users. Если в качестве ключевых значений используются случайные значения GUID и вставляется много строк, то это порождает увеличение операций ввода-вывода в индексах, что может отрицательно сказаться на производительности.If randomly generated GUIDs are used for key values and you insert a lot of rows, you get random I/O into your indexes, which can negatively impact performance. Кроме того, значения GUID относительно велики в сравнении с другими типами данных.GUIDs are also relatively large when compared to other data types. В целом значения GUID рекомендуется использовать только для узкого круга сценариев, для которых не подходят другие типы данных.In general we recommend using GUIDs only for very narrow scenarios for which no other data type is suitable.

Сравнение значений GUIDComparing GUID Values

Значения uniqueidentifier можно использовать в операторах сравнения.Comparison operators can be used with uniqueidentifier values. Однако их упорядочение реализовано без использования поразрядного сравнения.However, ordering is not implemented by comparing the bit patterns of the two values. Для значения uniqueidentifier допустимы только операции сравнения (=, < >, <, >, <=, > =) и проверки на NULL (имеет значение NULL и не равно NULL).The only operations that are allowed against a uniqueidentifier value are comparisons (=, <>, <, >, <=, >=) and checking for NULL (IS NULL and IS NOT NULL). Другие арифметические операторы запрещены.No other arithmetic operators are allowed.

В структурах Guid и SqlGuid имеется метод CompareTo для сравнения разных значений GUID.Both Guid and SqlGuid have a CompareTo method for comparing different GUID values. Однако методы System.Guid.CompareTo и SqlTypes.SqlGuid.CompareTo реализованы по-разному.However, System.Guid.CompareTo and SqlTypes.SqlGuid.CompareTo are implemented differently. В SqlGuid метод CompareTo реализуется при помощи поведения SQL Server в наиболее значимых последних 6 байтах значения.SqlGuid implements CompareTo using SQL Server behavior, in the last six bytes of a value are most significant. В Guid оцениваются все 16 байт.Guid evaluates all 16 bytes. В следующем примере демонстрируется это различие.The following example demonstrates this behavioral difference. В первой части кода показаны несортированные значения Guid, во второй части - сортированные значения Guid.The first section of code displays unsorted Guid values, and the second section of code shows the sorted Guid values. В третьей части показаны отсортированные значения SqlGuid.The third section shows the sorted SqlGuid values. Выходные данные показаны после листинга кода.The output is displayed beneath the code listing.

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);
    }
}
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

В этом примере получаются следующие результаты.This example produces the following results.

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  

См. такжеSee also