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


Сравнение GUID и уникальных значений идентификатора

Глобальный уникальный тип данных идентификатора (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($" {guidValue}");
    }
    Console.WriteLine("");

    // Sort the Guids.
    guidList.Sort();

    // Display the sorted Guid values.
    Console.WriteLine("Sorted Guids:");
    foreach (Guid guidSorted in guidList)
    {
        Console.WriteLine($" {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($" {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  

См. также