Frage

Ich bin mit SQL Server Performace ziemlich gut vertraut, aber ich muss konstants über die Idee argumentieren, dass Guids als Standardtyp für Clusterd -Primärschlüssel verwendet werden sollten.

Angenommen, die Tabelle hat eine ziemlich geringe Anzahl von Einsätzen pro Tag (5000 +/- Zeilen / Tag), auf welche Art von Performance-Problemen könnten wir auftreten? Wie wirken sich Page Splits auf unsere Suchleistung aus? Wie oft sollte ich mich wieder integrieren (oder sollte ich entfärbt)? Was soll ich die Füllfaktoren einstellen (100, 90, 80, ect)?

Was wäre, wenn ich 1.000.000 Reihen pro Tag einfügen würde?

Ich entschuldige mich vor Hand für alle Fragen, aber ich möchte eine Sicherung erhalten, weil sie keine Guids als Standard für PKs verwenden. Ich bin jedoch völlig offen dafür, dass mein Geist durch das übergewundene Wissen der Stackoverflow -Benutzerbasis verändert wurde.

War es hilfreich?

Lösung

Wenn Sie ein Volumen ausführen, sind die Richtlinien als PK -schlechtes schlechtes PK extrem schlecht Sequentielle Guids, aus den genauen Gründen, die Sie beschreiben. Seitenfragmentierung ist schwerwiegend:

                 Average                    Average
                 Fragmentation  Fragment    Fragment   Page     Average 
Type             in Percent     Count       Size       Count    Space Used

id               4.35           7           16.43      115      99.89
newidguid        98.77          162         1          162      70.90 
newsequentualid  4.35           7           16.43      115      99.89

Und wie Dieser Vergleich Zwischen Guids und Ganzzahlen zeigt:

Test1 verursachte eine enorme Menge an Seitenaufenteilen und hatte eine Scandichte herum 12% Als ich ein DBCC -Showcontig lief, nachdem die Einsätze abgeschlossen waren. Die Test2 -Tabelle hatte eine Scandichte um 98%

Wenn Ihr Volumen jedoch sehr niedrig ist, spielt es einfach keine Rolle.

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.

Andere Tipps

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

  • Keine aussagekräftige Bestellung, bedeutet, dass die Indexierung nicht wie bei einer Ganzzahl einen Leistungsschub verleiht.
  • Größe eines GUID 16 Bytes, gegenüber 2, 4 oder 8 Bytes für eine Ganzzahl.
  • Sehr schwierig für Menschen, sich zu erinnern, also nicht gut als Referenz -ID.

Vorteile:

  • Ermöglichen Sie nicht gesicherbare 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 bieten.
  • Nützlich, wenn Sie Daten zwischen zwei unterschiedlichen Datenquellen über Plattformen oder Umgebungen hinweg verbinden müssen.

Ich dachte, die Entscheidung, ob ich Guids verwenden soll, war ziemlich einfach, aber vielleicht bin ich mir anderer Probleme nicht bewusst.

Bei solch niedrigen Einsätzen pro Tag bezweifle ich, dass die Seitenaufteilung ein wesentlicher Faktor sein sollte. Die eigentliche Frage ist, wie 5.000 mit der vorhandenen Zeilenzahl verglichen werden, da dies die Hauptinformationen sind, die erforderlich sind, um einen geeigneten anfänglichen Füllfaktor für Deffer -Splits zu entscheiden.

Das heißt, ich bin persönlich kein großer Fan von Guids. Ich verstehe, dass sie in einigen Kontexten gut dienen können, aber in vielen Fällen nur "auf die Weise" [der Effizienz, der Benutzerfreundlichkeit, der ...].

Ich finde die folgenden Fragen nützlich, um zu entscheiden, ob GUID verwendet werden soll oder nicht.

  • Wird der PK geteilt/veröffentlicht? (IE wird es über seinen internen Gebrauch innerhalb von SQL hinaus verwendet. Werden Anwendungen diese Schlüssel auf eine gewisse dauerhafte Weise benötigen? Werden Benutzer diese Schlüssel irgendwie sehen?
  • Könnte das PK verwendet werden, um unterschiedliche Datenquellen zusammenzuführen?
  • Hat die Tabelle eine primäre zusammengesetzte zusammengesetzte Aussage aus Spalten in den Daten? Wie groß ist dies für diesen Schlüssel?
  • Wie sortieren die Primärschlüssel? Wenn Composite, sind die ersten Spalten ausgewählt?

Verwenden eines GUID (es sei denn, es handelt sich um eine sequentielle Richtlinie) als Clustered -Index wird die Einfügungsleistung abgeben. Da das Layout der physikalischen Tabelle nach dem Clustered -Index ausgerichtet ist, führt die Verwendung eines GUID mit einer zufälligen Reihenfolge einer schwerwiegenden Tabellenfragmentierung zu einer schwerwiegenden Tabellenfragmentierung. Wenn Sie einen GUID als PK/Clustered -Index verwenden möchten, muss dies eine sequentielle GUID unter Verwendung der Funktion newsequenentialId () in SQL Server sein. Dies wird garantieren, dass die generierten Guids nacheinander geordnet werden und Fragmentierung verhindern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top