Was sind die Leistungsaspekte zwischen der Verwendung einer breiten PK und einem separaten synthetischen Schlüssel und UQ?

10

Ich habe mehrere Tabellen, in denen Datensätze mit mehreren breiten Geschäftsfeldern eindeutig identifiziert werden können. In der Vergangenheit habe ich diese Felder als PK verwendet, mit folgenden Vorteilen:

  • Einfachheit; Es gibt keine fremden Felder und nur einen Index
  • Clustering ermöglicht schnelle Zusammenführungsverknüpfungen und bereichsbasierte Filter

Ich habe jedoch gehört, dass eine synthetische IDENTITY INTPK erstellt und stattdessen der Geschäftsschlüssel mit einer separaten UNIQUEEinschränkung erzwungen wird. Der Vorteil ist, dass die schmale PK viel kleinere Sekundärindizes ergibt.

Wenn eine Tabelle hat keine Indizes anders als die PK, sehe ich keinen Grund , den zweiten Ansatz zu bevorzugen, wenn auch in einem großen Tisch ist es wahrscheinlich am besten davon ausgeht , dass Indizes in der Zukunft notwendig sein kann, und damit die enge synthetische PK begünstige . Vermisse ich irgendwelche Überlegungen?

Im Übrigen bin ich nicht gegen die Verwendung von synthetischen Schlüsseln in Data Warehouses, sondern nur daran interessiert, wann eine einzelne breite PK und wann eine schmale PK plus eine breite UK verwendet werden soll.

Jon aller Berufe
quelle
1
Sie können dies oder das unter anderen Fragen auf der Website hilfreich finden
Jack sagt, versuchen Sie es mit topanswers.xyz

Antworten:

11

Die Verwendung des natürlichen Schlüssels als Clustered-Index bietet keinen wesentlichen Nachteil

  • Es gibt keine nicht gruppierten Indizes
  • Keine Fremdschlüssel, die auf diese Tabelle verweisen (es handelt sich um eine übergeordnete Zeile).

Der Nachteil wäre eine erhöhte Seitenteilung, da Dateneinfügungen nicht am Ende, sondern über die Daten verteilt würden.

Wenn Sie FKs oder NC-Indizes haben, hat die Verwendung eines schmalen, numerischen, zunehmenden Clustered-Index Vorteile. Sie wiederholen nur einige Datenbytes pro NC- oder FK-Eintrag, nicht den while business / natural key.

Lesen Sie auch die 5 Artikel von Google

Hinweis Ich habe die Verwendung von "Primärschlüssel" vermieden.

Sie können den Clustered-Index für den Ersatzschlüssel verwenden, die PK jedoch in den Geschäftsregeln beibehalten, jedoch nicht als Clustered. Stellen Sie einfach sicher, dass der Cluster eindeutig ist, da SQL einen "Eindeutiger" hinzufügt, um dies zu erreichen.

Schließlich kann es sinnvoll sein, einen Ersatzschlüssel zu haben, aber nicht blind für jede Tabelle : Viele-viele-Tabellen benötigen keinen, oder ein zusammengesetzter Schlüssel aus den übergeordneten Tabellen reicht aus

gbn
quelle
+1 für die Referenz Frau Tripp ausgezeichnete Artikel in der Indexierung.
Fabricio Araujo
2
+1 für den Punkt, dass Leistung nichts mit Primärschlüsseln und alles mit Indizes zu tun hat.
Nvogel
4

Obwohl ich das Offensichtliche riskiere, ist ein Index für einen Ersatzschlüssel (eine ID-Nummer) nützlich, wenn Sie Dinge anhand ihrer ID-Nummer suchen müssen. Benutzer werden sich nicht mit der ID-Nummer befassen. Sie werden sich mit lesbarem Text befassen. Sie müssen also den Text und seine ID-Nummer häufig weitergeben, damit die Benutzeroberfläche den Text anzeigen und die ID-Nummer bearbeiten kann.

Die Datenbank verwendet diese Art von Index, um Fremdschlüssel zu unterstützen, wenn Sie sie auf diese Weise definieren.

Sie können die Leistung manchmal verbessern, indem Sie ID-Nummern als Fremdschlüssel verwenden. Dies ist jedoch keine absolute Verbesserung. In unserem OLTP-System übertrafen Fremdschlüssel mit natürlichen Schlüsseln Fremdschlüssel mit ID-Nummern in einer Testsuite mit etwa 130 (glaube ich) repräsentativen Abfragen. (Da die wichtigen Informationen häufig in den Schlüsseln enthalten sind, wurden durch die Verwendung der natürlichen Schlüssel viele Verknüpfungen vermieden .) Die mittlere Beschleunigung betrug den Faktor 85 (Verknüpfungen mit ID-Nummern dauerten 85-mal länger, um Zeilen zurückzugeben).

Tests haben gezeigt, dass Verknüpfungen mit ID-Nummern nicht schneller ausgeführt werden als das Lesen natürlicher Schlüssel in unserer Datenbank, bis bestimmte Tabellen viele Millionen Zeilen erreicht haben. Die Breite der Zeile hat viel damit zu tun - breitere Zeilen bedeuten, dass weniger Zeilen auf eine Seite passen. Sie müssen also mehr Seiten lesen, um 'n' Zeilen zu erhalten. Fast alle unsere Tische sind in 5NF; Die meisten Tabellen sind ziemlich eng.

Durch die Zeit einfach aus ausführen starten verbindet liest hier , kritische Tabellen und Indizes auf einem Solid State Disk setzen kann die Leistung in die Hunderte von Millionen von Zeilen nivellieren.

Mike Sherrill 'Cat Recall'
quelle
3

Ich habe eine ganze oltp-Datenbank, die mit Identitätsspalten für Clustering + pk entworfen wurde. Es funktioniert ziemlich schnell beim Einfügen / Suchen, aber ich habe ein paar Probleme gesehen:
1. Die Indexfülloption ist nutzlos, da die Einfügungen nur bis zum Ende des Index erfolgen.
2. Mehr Speicherplatz. Ich habe Tabellen mit zig Millionen Datensätzen und 1 int nimmt von sich aus Platz ein. Jede Tabelle mit einer Identitätsspalte für ihr Paket muss einen anderen Index für Geschäftssuchen haben, sodass noch mehr Speicher erforderlich ist.
3. Skalierbarkeit. Dies ist das schlimmste Problem. Da jede Einfügung an das Ende des Index geht, wird bei jeder Einfügung nur das Ende des Index betont (Zuweisung, io für Schreibvorgänge usw.). Durch die Verwendung eines Geschäftsschlüssels als Clustering-Schlüssel können Sie die Einfügungen gleichmäßig auf den Index verteilen. Das bedeutet, dass Sie gerade einen großen Hotspot beseitigt haben. Sie können problemlos mehr Dateien für einen Index verwenden, wobei jede Datei auf einem separaten Laufwerk und jedes Laufwerk separat funktioniert.

Ich habe angefangen, meine Tabellen von einer Identitätsspalte in natürliche Schlüssel zu ändern (möglicherweise getrennt für Clustering & pk). Es fühlt sich jetzt einfach besser an.

Ich würde Folgendes vorschlagen (zumindest für eine oltp-Datenbank):
1. Verwenden Sie als Clustering-Schlüssel die richtigen Spalten in der richtigen Reihenfolge, um die häufigsten Abfragen zu optimieren.
2. Verwenden Sie ein pk die richtigen Spalten, die für Ihre Tabelle sinnvoll sind

Wenn der Clustered Key nicht einfach ist und Zeichen enthält (char [], varchar, nvarchar), lautet die Antwort meiner Meinung nach "es kommt darauf an". Sie sollten jeden Fall einzeln analysieren.

Ich behalte das folgende Prinzip bei: Optimieren Sie für die häufigste Abfrage und minimieren Sie das Worst-Case-Szenario.

Ich habe fast ein Beispiel vergessen. Ich habe einige Tabellen, die sich selbst referenzieren. Wenn diese Tabelle eine Identitätsspalte für ihren Primärschlüssel enthält, muss möglicherweise nur eine Zeile eingefügt werden, und es kann schwierig oder gar unmöglich sein, mehrere Zeilen gleichzeitig einzufügen (dies hängt vom Tabellendesign ab).

Catalin Adler
quelle
4
Ihr "Hotspot" -Konzept ist ein Mythos: dba.stackexchange.com/questions/1584/… Und wenn Sie sagen "Es fühlt sich jetzt einfach besser an." hast du Benchmarking?
Gbn
4
Ja, Schreibvorgänge werden im Speicher nicht direkt auf die Festplatte ausgeführt. Wenn Sie 20 neue Zeilen auf eine Seite schreiben, wird nur 1 physisch in die Datendatei geschrieben, wenn der Prüfpunkt auftritt.
Mrdenny
@mrdenny mit genügend Einfügungen, die alles an das Ende des Index schreiben, würde alle io-Schreibanforderungen an dieselbe Datei senden. Ich vermute, dass die Verwendung normaler Oltp-Transaktionen in diesem Szenario schwierig zu reproduzieren ist. Wenn Sie jedoch einige spezielle Szenarien verwenden, z. B. das Einfügen von Datensätzen per Bulk / Batch und die Verwendung von ssis zum Verschieben einiger Geschäftsdaten, gelangen Sie dorthin.
Catalin Adler
1
@ user973156 Ja, alle Anforderungen werden für dieselbe Datei ausgeführt, aber die Schreibvorgänge werden erst dann auf die Festplatte übertragen, wenn der Prüfpunkt nur jede Minute (standardmäßig) oder wenn der Schreibpuffer zu 50% voll ist. Es spielt keine Rolle, wie Sie die Daten schreiben. Diese Regel gilt weiterhin.
Mrdenny
2
@ user973156 Die Verwendung eines zufällig verteilten Clusterschlüssels führt zu einer Indexfragmentierung. Die Indexfragmentierung führt zu Leistungsproblemen. Und Ihre Tabelle wird groß genug, dass die Durchführung der Indexdefragmentierung "lange" dauert und den Protokollspeicher und möglicherweise den temporären Speicherplatz verschlingt. Wenn mir Leute wie Kimberly Tripp sagen, dass es eine gute Idee ist, höre ich zu. ( sqlskills.com/BLOGS/KIMBERLY/post/… )
Matt M
2

Aus Sicht der Leistung spielt die Wahl des Schlüssels, der der "Primärschlüssel" ist, überhaupt keine Rolle. Es gibt keinen Unterschied zwischen der Verwendung eines PRIMARY KEY und einer UNIQUE-Einschränkung zum Erzwingen Ihrer Schlüssel.

Die Leistung wird durch die Auswahl und Art der Indizes und anderer Speicheroptionen sowie durch die Art und Weise bestimmt, wie die Schlüssel in Abfragen und Code verwendet werden.

nvogel
quelle