Verwenden von GUIDs in Primärschlüsseln / Clusted-Indizes

8

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.

    
NTDLS 24.09.2009, 03:46
quelle

4 Antworten

8

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.

    
Rex M 24.09.2009, 04:00
quelle
2

Nachteile der Verwendung von GUID als Primärschlüssel:

  • Keine sinnvolle Reihenfolge, dh die Indexierung führt nicht zu einer Leistungssteigerung wie bei einer Ganzzahl.
  • Größe einer GUID 16 Byte im Vergleich zu 2, 4 oder 8 Byte für eine ganze Zahl.
  • Sehr schwer für Menschen, sich daran zu erinnern, also nicht gut als Referenz ID.

Vorteile:

  • Erlauben Sie nicht erratbare Primärschlüssel, die daher weniger gefährlich sein können, wenn sie in einer Webseiten-Abfragezeichenfolge oder in der Anwendung angezeigt werden.
  • Nützlich in Datenbanken, die keinen automatischen Inkrement- oder Identitätsdatentyp bereitstellen.
  • Nützlich, wenn Sie Daten zwischen zwei verschiedenen Datenquellen über Plattformen oder Umgebungen hinweg verbinden müssen.

Ich dachte, die Entscheidung, ob GUIDs verwendet werden sollten, war ziemlich einfach, aber vielleicht bin ich mir anderer Probleme nicht bewusst.

    
Ash 24.09.2009 03:58
quelle
1

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.

  • Wird die PK freigegeben / veröffentlicht? (Wird es außerhalb seiner internen Verwendung in SQL verwendet werden, werden Anwendungen diese Schlüssel auf eine etwas hartnäckige Weise benötigen? Benutzer sehen diese Schlüssel irgendwie?
  • Könnte die PK dazu verwendet werden, verschiedene Datenquellen zusammenzuführen?
  • Hat die Tabelle ein primäres - möglicherweise zusammengesetztes - aus Spalten in den Daten? Welche Größe hat dieser Schlüssel?
  • Wie sortieren die Primärschlüssel? Wenn zusammengesetzt, sind die ersten paar Spalten selektiv?
mjv 24.09.2009 04:00
quelle
0

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.

    
Matt Wrock 24.09.2009 04:05
quelle