GUID vs.Sequential GUID
Ein typisches Muster ist die Verwendung von Guid als PK für Tabellen, aber wie in anderen Diskussionen erwähnt (siehe Vor- und Nachteile von GUID / UUID-Datenbankschlüsseln), gibt es einige Leistungsprobleme.
Dies ist eine typische Guid-Sequenz
f3818d69-2552-40b7-a403-01a6db4552f7
7ce31615-fafb-42c4-b317-40d21a6a3c60
94732fc7-768e-4cf2-9107-f0953f6795a5
Probleme dieser Art von Daten sind:<
-
- Weite Verteilung von Werten
- Fast zufällige
- Indexnutzung ist sehr, sehr, sehr schlecht
- Viele Leaf-Verschiebungen
- Fast alle PK müssen zumindest in einem nicht gruppierten Index sein
- Problem tritt sowohl bei Oracle als auch bei SQL Server auf
Eine mögliche Lösung ist die Verwendung von Sequential Guid, die wie folgt generiert werden:
cc6466f7-1066-11dd-acb6-005056c00008
cc6466f8-1066-11dd-acb6-005056c00008
cc6466f9-1066-11dd-acb6-005056c00008
Wie man sie aus C#-Code generiert:
[DllImport("rpcrt4.dll", SetLastError = true)]
static extern int UuidCreateSequential(out Guid guid);
public static Guid SequentialGuid()
{
const int RPC_S_OK = 0;
Guid g;
if (UuidCreateSequential(out g) != RPC_S_OK)
return Guid.NewGuid();
else
return g;
}
Vorteile
- Bessere Indexnutzung
- Erlauben die Verwendung von gruppierten Schlüsseln (in NLB-Szenarien zu überprüfen)
- Weniger Festplattenauslastung
- 20-25% Leistungssteigerung bei geringfügigen Kosten
Reale Messung: Szenario:
- Guid gespeichert als UniqueIdentifier Datentypen auf SQL Server
- Guid als CHAR(36) in Oracle gespeichert
- Viele Einfügevorgänge, gruppiert in einer einzigen Transaktion
- Von 1 bis zu 100 Einfügungen je nach Tabelle
- Einige Tabellen > 10 Millionen Zeilen
Labor-Test - SQL Server
VS2008 Test, 10 gleichzeitige Benutzer, keine Wartezeit, Benchmark-Prozess mit 600 Einfügungen im Batch für Leaf-Tabelle
Standard Guid
Durchschnittliche Prozessdauer: 10,5 Sek.
Durchschnittliche Anfragen pro Sekunde: 54,6
Durchschnittliche Antwortzeit: 0,26
Sequential Guid
Durchschnittliche Prozessdauer: 4,6 Sek.
Durchschnittliche Anfragen pro Sekunde: 87,1
Durchschnittliche Antwortzeit: 0,12
Ergebnisse in Oracle (Entschuldigung, ein anderes Tool wurde für den Test verwendet) 1.327.613 Einfügungen in einer Tabelle mit einem Guid PK
Standard Guid, 0,02 Sek. vergangene Zeit für jede Einfügung, 2,861 Sek. CPU-Zeit, insgesamt 31,049 Sek. vergangen
Sequential Guid, 0,00 Sek. vergangene Zeit für jede Einfügung, 1,142 Sek. CPU-Zeit, insgesamt 3,667 Sek. vergangen
Die DB-Datei-Sequenzlese-Wartezeit ging von 6,4 Millionen Warteereignissen für 62,415 Sekunden auf 1,2 Millionen Warteereignisse für 11,063 Sekunden über.
Es ist wichtig zu sehen, dass alle sequenziellen Guid erraten werden können, daher ist es keine gute Idee, sie zu verwenden, wenn Sicherheit ein Anliegen ist, weiterhin Standard-Guid verwenden. Um es kurz zu machen...Wenn Sie Guid als PK verwenden, verwenden Sie sequenzielle Guid jedes Mal, wenn sie nicht hin und her von einer Benutzeroberfläche übergeben werden, sie beschleunigen Vorgänge und kosten nichts zu implementieren.