it-swarm.com.de

Zeichenfolgen als Primärschlüssel in der SQL-Datenbank

Ich bin nicht sehr vertraut mit Datenbanken und deren Theorien. Ist die Verwendung von Strings für Primärschlüssel aus Performance-Sicht (Einfügen/Aktualisieren/Abfragen) langsamer als Ganzzahlen? 

145
mainstringargs

Technisch gesehen ja, aber wenn ein String als Primärschlüssel sinnvoll ist, sollten Sie ihn wahrscheinlich verwenden. Dies hängt alles von der Größe der Tabelle ab, für die Sie die Tabelle erstellen, und der Länge der Zeichenfolge, die der Primärschlüssel sein wird (längere Zeichenfolgen sind schwieriger zu vergleichen). Ich würde nicht unbedingt eine Zeichenfolge für eine Tabelle mit Millionen von Zeilen verwenden, aber die Verringerung der Leistung, die Sie durch die Verwendung einer Zeichenfolge in kleineren Tabellen erhalten, wird zu den Kopfschmerzen, die Sie mit einer Ganzzahl haben können, die nichts tut Es bedeutet nichts in Bezug auf die Daten.

154
kemiller2002

Ein weiteres Problem bei der Verwendung von Strings als Primärschlüssel besteht darin, dass der Index bei der Erstellung eines neuen Schlüssels, der sich in der Mitte der Reihenfolge befindet, neu sortiert werden muss, da der Index ständig in sequenzieller Reihenfolge angeordnet wird number integer, der neue Schlüssel wird nur am Ende des Indexes hinzugefügt.

59
Jeff Martin

Einfügungen in eine Tabelle mit einem gruppierten Index, bei dem die Einfügung in der Mitte der Sequenz erfolgt, bewirkt NICHT, dass der Index neu geschrieben wird. Die Seiten, aus denen die Daten bestehen, werden nicht neu geschrieben. Wenn auf der Seite Platz ist, in den die Zeile verschoben werden soll, wird sie auf dieser Seite platziert. Die einzelne Seite wird neu formatiert, um die Zeile an der richtigen Stelle auf der Seite zu platzieren. Wenn die Seite voll ist, erfolgt eine Seitenaufteilung, wobei die Hälfte der Zeilen auf der Seite zu einer Seite und die andere zur anderen Seite führt. Die Seiten werden dann erneut in die verknüpfte Liste der Seiten eingebunden, die Tabellendaten umfassen, die den gruppierten Index enthalten. Am Ende werden Sie 2 Seiten Datenbank schreiben. 

17
Mark Thompson

Strings sind in Joins langsamer und im wirklichen Leben sind sie selten wirklich einzigartig (selbst wenn sie es sein sollen). Der einzige Vorteil ist, dass sie die Anzahl der Verknüpfungen reduzieren können, wenn Sie nur mit der Primärtabelle verbunden werden, um den Namen zu erhalten. Strings unterliegen jedoch häufig auch Änderungen, so dass das Problem besteht, dass alle zugehörigen Datensätze korrigiert werden müssen, wenn sich der Firmenname ändert oder die Person heiratet. Dies kann ein enormer Leistungstreffer sein und wenn alle Tabellen, die irgendwie miteinander in Beziehung stehen sollten, nicht miteinander in Beziehung stehen (dies passiert öfter als Sie denken), dann können auch Datenkonflikte auftreten. Eine Ganzzahl, die sich während der gesamten Lebensdauer des Datensatzes niemals ändern wird, ist sowohl aus Sicht der Datenintegrität als auch hinsichtlich der Leistung eine weitaus sicherere Wahl. Natürliche Schlüssel sind normalerweise nicht so gut für die Pflege der Daten.

Ich möchte auch darauf hinweisen, dass das Beste aus beiden Welten oft die Verwendung eines Autoincrementing-Schlüssels (oder in einigen speziellen Fällen einer GUID) als PK ist, und dann den eindeutigen Index auf den natürlichen Schlüssel setzen. Sie erhalten die schnelleren Verknüpfungen, Sie erhalten keine doppelten Datensätze, und Sie müssen keine Million untergeordneter Datensätze aktualisieren, da sich der Firmenname geändert hat. 

11
HLGEM

Es ist egal, was Sie als Primärschlüssel verwenden, solange es UNIQUE ist. Wenn Sie Wert auf Geschwindigkeit oder einen guten Datenbankentwurf legen, verwenden Sie int, sofern Sie nicht die Daten replizieren möchten. Verwenden Sie dann eine GUID.

Wenn es sich um eine Access-Datenbank oder eine winzige App handelt, dann kümmert es wen. Ich denke, der Grund, warum die meisten von uns Entwicklern das alte int oder guid an die Front schlagen, ist, weil Projekte auf eine Weise wachsen, auf uns zu wachsen, und Sie wollen sich die Möglichkeit lassen, zu wachsen. 

7
Al Katawazi

Machen Sie sich keine Gedanken über die Leistung, bis Sie ein einfaches und solides Design haben, das mit dem von den Daten beschriebenen Gegenstand übereinstimmt und der beabsichtigten Verwendung der Daten gut entspricht. Wenn dann Leistungsprobleme auftauchen, können Sie diese durch Optimieren des Systems lösen.

In diesem Fall ist es fast immer besser, einen String als natürlichen Primärschlüssel zu verwenden, sofern Sie ihm vertrauen können. Machen Sie sich keine Sorgen, wenn es sich um einen String handelt, solange der String relativ kurz ist, sagen Sie bitte maximal 25 Zeichen. Sie zahlen keinen großen Preis in Bezug auf die Leistung.

Bieten die Dateneingabepersonen oder automatischen Datenquellen immer einen Wert für den angenommenen natürlichen Schlüssel oder werden sie manchmal ausgelassen? Ist es gelegentlich falsch bei den Eingabedaten? Wenn ja, wie werden Fehler erkannt und korrigiert? 

Können Programmierer und interaktive Benutzer, die Abfragen angeben, den natürlichen Schlüssel verwenden, um das zu bekommen, was sie wollen? 

Wenn Sie dem natürlichen Schlüssel nicht vertrauen können, erfinden Sie einen Ersatz. Wenn Sie ein Ersatzzeichen erfinden, können Sie ebenso eine ganze Zahl erfinden. Dann müssen Sie sich sorgen, ob Sie den Ersatz vor der Benutzergemeinschaft verbergen. Einige Entwickler, die den Ersatzschlüssel nicht verdeckten, bedauerten es.

4
Walter Mitty

Zu viele Variablen. Dies hängt von der Größe der Tabelle, den Indizes, der Art der String-Schlüsseldomäne ab.

Allgemein, ganze Zahlen werden schneller. Aber wird der Unterschied groß genug sein, um sich darum zu kümmern? Es ist schwer zu sagen.

Was ist auch Ihre Motivation, Strings zu wählen? Numerische Auto-Inkrement-Schlüssel sind oft auch einfacher. Ist es Semantik? Bequemlichkeit? Replikation/getrennte Bedenken? Ihre Antwort hier könnte Ihre Möglichkeiten einschränken. Dies erinnert auch an eine dritte "Hybrid" -Option, die Sie vergessen: Guids. 

4
Joel Coehoorn

Indizes weisen viele Vergleiche auf.

In der Regel sind Zeichenfolgen länger als Ganzzahlen, und zum Vergleich können Kollatierungsregeln angewendet werden. Daher ist das Vergleichen von Zeichenfolgen normalerweise eine rechenintensivere Aufgabe als der Vergleich von Ganzzahlen. 

Manchmal ist es jedoch schneller, eine Zeichenfolge als Primärschlüssel zu verwenden, als eine zusätzliche Verknüpfung mit einer string to numerical id-Tabelle herzustellen.

2
Quassnoi

Ja, aber wenn Sie nicht erwarten, Millionen Zeilen zu haben, verwenden Sie keinen stringbasierten Schlüssel, da er langsamer ist. Dies ist in der Regel eine "vorzeitige Optimierung". Zeichenfolgen werden schließlich als große Zahlen gespeichert, während numerische Tasten normalerweise als kleinere Zahlen gespeichert werden.

Eine Sache, die Sie beachten sollten, ist, wenn Sie Indizes für einen beliebigen Schlüssel gruppiert haben und eine große Anzahl von Einfügungen vornehmen, die im Index nicht sequenziell sind. Jede geschriebene Zeile bewirkt, dass der Index neu geschrieben wird. Wenn Sie Batch-Inserts verwenden, kann dies den Prozess wirklich verlangsamen.

2

Zwei Gründe für die Verwendung von Ganzzahlen für PK-Spalten:

  1. Wir können Identität für ein ganzzahliges Feld festlegen, das automatisch inkrementiert wird.

  2. Beim Erstellen von PKs erstellt die Datenbank einen Index (Cluster oder Nicht-Cluster), der die Daten sortiert, bevor sie in der Tabelle gespeichert werden. Durch die Verwendung einer Identität für eine PK muss das Optimierungsprogramm die Sortierreihenfolge vor dem Speichern eines Datensatzes nicht überprüfen. Dies verbessert die Leistung bei großen Tischen.

2
Jatinder Singh

Vom Standpunkt der Leistung aus - Ja, String (PK) verringert die Leistung im Vergleich zur Leistung, die mit einer Ganzzahl (PK) erzielt wird, wobei PK ---> Primärschlüssel.

Aus der Sicht der Anforderungen - Obwohl dies nicht Teil Ihrer Frage ist, möchte ich noch erwähnen. Beim Umgang mit riesigen Daten in verschiedenen Tabellen suchen wir im Allgemeinen nach den wahrscheinlichen Schlüsselsätzen, die für eine bestimmte Tabelle festgelegt werden können. Dies liegt vor allem daran, dass es viele Tabellen gibt und meistens jede oder einige der Tabellen durch eine Relation (ein Konzept eines Fremdschlüssels) mit der anderen verbunden sind. Daher können wir nicht immer eine ganze Zahl als Primärschlüssel wählen, sondern als Kombination aus 3, 4 oder 5 Attributen als Primärschlüssel für diese Tabellen. Diese Schlüssel können als Fremdschlüssel verwendet werden, wenn die Datensätze mit einer anderen Tabelle verknüpft werden. Dies macht es hilfreich, die Datensätze bei Bedarf in verschiedenen Tabellen zu verknüpfen.

Daher für eine optimale Verwendung - Wir erstellen immer eine Kombination aus 1 oder 2 Ganzzahlen mit 1 oder 2 Zeichenfolgenattributen, jedoch nur dann, wenn dies erforderlich ist.

1
Arijit

Warum haben Sie einen String als Primärschlüssel?

Ich würde einfach den Primärschlüssel auf ein automatisch inkrementierendes Integerfeld setzen und einen Index für das Stringfeld setzen.

Wenn Sie also auf dem Tisch suchen, sollten sie relativ schnell sein, und alle Ihre Verknüpfungen und normalen Suchvorgänge werden in ihrer Geschwindigkeit nicht beeinträchtigt.

Sie können auch die Menge des String-Felds steuern, das indiziert wird. Mit anderen Worten, Sie können "nur die ersten 5 Zeichen indexieren" sagen, wenn Sie denken, dass dies ausreicht. Wenn Ihre Daten relativ ähnlich sein können, können Sie das gesamte Feld indizieren.

1
John Bubriski

Es kann ein sehr großes Missverständnis bezüglich der Zeichenfolge in der Datenbank geben. Fast jeder hat geglaubt, dass die Datenbankdarstellung von Zahlen kompakter ist als für Strings. Sie denken, dass in db-s Zahlen wie im Speicher dargestellt werden. ABER es stimmt nicht. In den meisten Fällen ist die Zahlendarstellung eher eine A-ähnliche Darstellung als eine andere. 

Die Geschwindigkeit der Verwendung von number oder string hängt mehr von der Indizierung als vom Typ selbst ab.

0
takacsot

Standardmäßig sind ASPNetUserIds 128 Zeichenfolgen und die Leistung ist gut.

Wenn der Schlüssel in der Tabelle eindeutig ist, sollte er der Schlüssel sein. Hier ist der Grund; 

primärer Zeichenkettenschlüssel = Korrekte DB-Beziehungen, 1 Zeichenkettenschlüssel (primär) und 1 Zeichenkettenindex (primär).  

Die andere Option ist ein typischer int-Schlüssel, aber wenn die Zeichenfolge hat, um eindeutig zu sein, müssen Sie wahrscheinlich immer noch einen Index hinzufügen, da Abfragen ohne Unterbrechung durchgeführt werden, um die Eindeutigkeit zu überprüfen.

Bei Verwendung eines int-Identitätsschlüssels = Ungültige DB-Beziehungen, 1 Int-Schlüssel (Primär), 1 Int-Index (Primär), Wahrscheinlich ein eindeutiger Zeichenfolgenindex, und das manuelle Validieren derselben Zeichenfolge ist nicht vorhanden (z. B. SQL überprüfen Sie vielleicht).

Um eine bessere Leistung zu erzielen, wenn ein int über einem String für den Primärschlüssel verwendet wird, muss der String eindeutig sein, wenn dies eine eindeutige Situation ist. Ich habe es immer vorgezogen, String-Schlüssel zu verwenden. Und als eine gute Faustregel denormalisieren Sie eine Datenbank nicht, bis Sie benötigen.

0
JPoole