Ich bin ziemlich versiert in SQL-Server-Leistung, aber ich muss ständig argumentieren, dass GUIDs als Standardtyp für Clusterd-Primärschlüssel verwendet werden sollten.
Unter der Annahme, dass die Tabelle eine relativ geringe Anzahl von Einfügevorgängen pro Tag aufweist (5000 +/- Zeilen / Tag), auf welche Art von Leistungsproblemen könnten wir stoßen? Wie wirken sich Seitenaufteilungen auf unsere Suchleistung aus? Wie oft sollte ich neu indizieren (oder sollte ich defragmentieren)? Was sollte ich die Füllfaktoren auf (100, 90, 80, ect) setzen?
Was wäre, wenn ich 1.000.000 Zeilen pro Tag einfügen würde?
Ich entschuldige mich für alle Fragen, aber ich suche nach Backup, um keine GUIDs als Standard für PKs zu verwenden. Ich bin jedoch völlig offen dafür, mich durch das überschwängliche Wissen der StackOverflow-Benutzerbasis verändern zu lassen.
Wenn Sie irgendeine Art von Volume ausführen, sind GUIDs als PK schlecht, es sei denn, Sie verwenden sequentielle GUIDs , für die genauen Gründe, die Sie beschreiben. Seitenfragmentierung ist schwerwiegend :
%Vor%Und als dieser Vergleich zwischen GUIDs und ganzen Zahlen zeigt:
Test1 verursachte eine enorme Menge an Seitenaufteilungen und hatte eine Scan-Dichte um 12% , als ich einen DBCC SHOWCONTIG ausführte, nachdem die Einfügungen abgeschlossen waren. Die Test2-Tabelle hatte eine Scan-Dichte von etwa 98%
Wenn Ihre Lautstärke sehr niedrig ist, ist das nicht so wichtig.
Wenn Sie wirklich eine global eindeutige ID benötigen, aber ein hohes Volumen haben (und keine sequentiellen IDs verwenden können), legen Sie einfach die GUIDs in eine indizierte Spalte.
Nachteile der Verwendung von GUID als Primärschlüssel:
Vorteile:
Ich dachte, die Entscheidung, ob GUIDs verwendet werden sollten, war ziemlich einfach, aber vielleicht bin ich mir anderer Probleme nicht bewusst.
Bei solch niedrigen Einsätzen pro Tag bezweifle ich, dass das Aufteilen der Seite ein wesentlicher Faktor sein sollte. Die eigentliche Frage ist, wie sich 5.000 mit der vorhandenen Anzahl von Zeilen vergleichen lässt, da dies die Hauptinformation wäre, die benötigt wird, um über einen geeigneten anfänglichen Füllfaktor zu entscheiden, um Aufteilungen aufzudecken.
Das sagte ich persönlich bin kein großer Fan von GUIDs. Ich verstehe, dass sie in manchen Kontexten gut funktionieren können, aber in vielen Fällen sind sie nur "im Weg" [der Effizienz, der Benutzerfreundlichkeit, der ...]
Ich finde die folgenden Fragen nützlich, um zu entscheiden, ob GUID verwendet werden soll oder nicht.
Wenn Sie eine GUID als Clustered-Index verwenden (sofern es sich nicht um eine sequenzielle GUID handelt), wird die Insert-Leistung beendet. Da das physische Tabellenlayout gemäß dem gruppierten Index ausgerichtet ist, führt die Verwendung einer GUID, die eine zufällige Reihenfolge aufweist, zu schwerwiegenden Tabellenfragmentierungen. Wenn Sie eine GUID als PK / Clustered-Index verwenden möchten, muss es sich um eine sequenzielle GUID handeln, die die Funktion newsequentialid () in SQL Server verwendet. Dies garantiert, dass die erzeugten Guides sequentiell geordnet sind und Fragmentierung verhindern.
Tags und Links sql-server uniqueidentifier sql-server-performance