Condividi tramite


Confronto tra GUID e valori di tipo uniqueidentifier

Il tipo di dati identificatore univoco globale (GUID) in SQL Server è rappresentato dal uniqueidentifier tipo di dati, che archivia un valore binario a 16 byte. Un GUID è un numero binario e il suo uso principale è come identificatore che deve essere univoco in una rete con molti computer in molti siti. I GUID possono essere generati chiamando la funzione Transact-SQL NEWID ed è garantito che siano univoci in tutto il mondo. Per altre informazioni, vedere uniqueidentifier (Transact-SQL).

Utilizzo dei valori sqlGuid

Poiché i valori GUID sono lunghi e oscuri, non sono significativi per gli utenti. Se i GUID generati in modo casuale vengono usati per i valori chiave e si inseriscono molte righe, si ottengono operazioni di I/O casuali nell'indice, che possono influire negativamente sulle prestazioni. I GUID sono anche relativamente grandi rispetto ad altri tipi di dati. In generale, è consigliabile usare GUID solo per scenari molto stretti per i quali nessun altro tipo di dati è adatto.

Confronto di valori GUID

Gli operatori di confronto possono essere usati con uniqueidentifier valori. Tuttavia, l'ordinamento non viene implementato confrontando i modelli di bit dei due valori. Le uniche operazioni consentite rispetto a un uniqueidentifier valore sono confronti (=, <>, , <>, <=, >=) e il controllo di NULL (IS NULL e IS NOT NULL). Non sono consentiti altri operatori aritmetici.

Sia Guid che SqlGuid hanno un CompareTo metodo per confrontare valori GUID diversi. Tuttavia, System.Guid.CompareTo e SqlTypes.SqlGuid.CompareTo vengono implementati in modo diverso. SqlGuid implementa CompareTo utilizzando il comportamento di SQL Server, in cui gli ultimi sei byte di un valore sono i più significativi. Guid valuta tutti i 16 byte. L'esempio seguente illustra questa differenza comportamentale. La prima sezione del codice visualizza i valori non ordinati Guid e la seconda sezione del codice mostra i valori ordinati Guid . La terza sezione mostra i valori ordinati SqlGuid . L'output viene visualizzato sotto l'elenco di codice.

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

In questo esempio vengono generati i risultati seguenti.

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  

Vedere anche