Confronto tra GUID e valori uniqueidentifier
Il tipo di dati identificatore univoco globale (GUID, Globally Unique IDentifier) in SQL Server è rappresentato dal tipo di dati uniqueidentifier
, in cui è archiviato un valore binario di 16 byte. Un GUID è un numero binario usato principalmente come identificatore univoco in una rete con molti computer in più siti. I GUID possono essere generati chiamando la funzione NEWID di Transact-SQL. Si assicura l'univocità in tutto il mondo. Per altre informazioni, vedere uniqueidentifier (Transact-SQL).
Uso di valori SqlGuid
I GUID sono valori lunghi e poco chiari, pertanto molti utenti non ne comprendono il significato. Se si usano GUID generati in modo casuale per valori chiave e se si inserisce un numero elevato di righe, l'I/O negli indici sarà casuale, determinando un impatto negativo sulle prestazioni. Rispetto ad altri tipo di dati, i GUID sono anche valori relativamente grandi. È in genere consigliabile usare i GUID solo per pochi scenari, nei quali non sono adatti altri tipi di dati.
Confronto di valori GUID
Con valori uniqueidentifier
è possibile usare gli operatori di confronto. Quando si confrontano gli schemi di bit dei due valori, tuttavia, l'ordinamento non viene implementato. Le uniche operazioni consentite su un valore uniqueidentifier
sono i confronti (=, <>, <, >, <=, >=) e il controllo di valori NULL (IS NULL e IS NOT NULL). Non sono ammessi altri operatori aritmetici.
Sia Guid che SqlGuid usano un metodo CompareTo
per confrontare valori GUID diversi. System.Guid.CompareTo
e SqlTypes.SqlGuid.CompareTo
sono tuttavia implementati in modo diverso. SqlGuid implementa CompareTo
usando il comportamento di SQL Server, in cui gli ultimi 6 byte di un valore sono i più significativi. Guid valuta tutti i 16 byte. L'esempio seguente illustra queste differenze di comportamento. La prima sezione del codice visualizza valori Guid non ordinati, mentre la seconda sezione visualizza i valori Guid ordinati. La terza sezione visualizza i valori SqlGuid ordinati. L'output viene visualizzato sotto l'elenco codici.
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
L'esempio produce 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