Поделиться через


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

Тип данных глобального уникального идентификатора (GUID) в SQL Server представлен типом данных uniqueidentifier, который хранит 16-байтное двоичное значение. GUID — это двоичное число, которое используется в первую очередь как уникальный идентификатор в сети, в которой имеется много компьютеров на множестве сайтов. Идентификаторы GUID могут быть созданы путем вызова функции NEWID в Transact-SQL и гарантированно уникальны во всем мире. Дополнительные сведения см. в статье uniqueidentifier (Transact-SQL).

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

Так как значения GUID являются длинными и сложными, для пользователей они не имеют смысла. Если случайно сгенерированные идентификаторы GUID используются для ключевых значений и вы вставляете большое количество строк, вы получаете случайные операции ввода-вывода в индексах, что может отрицательно сказаться на производительности. Идентификаторы GUID также относительно велики по сравнению с другими типами данных. В общем случае идентификаторы GUID рекомендуется использовать только в очень ограниченном круге ситуаций, когда ни один другой тип данных не подходит.

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

Значения uniqueidentifier поддерживают операторы сравнения, однако их упорядочивание реализовано без использования поразрядного сравнения. Над значениями uniqueidentifier можно выполнять только операции сравнения (=, <>, <, >, <=, >=), а также проверку на значение NULL (IS NULL и IS NOT NULL). Другие арифметические операторы не допускаются.

Как Guid, так и SqlGuid содержат метод CompareTo для сравнения различных значений GUID. Однако System.Guid.CompareTo и SqlTypes.SqlGuid.CompareTo реализуются по-разному. SqlGuid реализует CompareTo, используя поведение SQL Server, в последних шести байтах значения, которые являются наиболее значимыми. Guid вычисляет все 16 байт. Это различие в поведении демонстрируется в следующем примере. В первом фрагменте кода показаны несортированные значения Guid, а во втором фрагменте показаны отсортированные значения Guid. В третьем фрагменте показаны отсортированные значения SqlGuid. Выходные данные отображаются под листингом кода.

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

В примере получается следующий вывод.

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  

См. также