Was sind die best practices für die Verwendung einer GUID als Primärschlüssel, insbesondere in Bezug auf die Leistung?
Ich habe eine Anwendung die GUID als Primärschlüssel in fast allen Tabellen und ich habe gelesen, dass es Probleme sind, über die Leistung bei der Verwendung von GUID als Primärschlüssel. Ehrlich gesagt, ich habe nicht gesehen, jedes problem, aber ich bin über den start einer neuen Anwendung, und ich will immer noch die Verwendung der GUIDs als Primärschlüssel, aber ich dachte an mit einem Zusammengesetzten Primärschlüssel (GUID und vielleicht ein anderes Feld).
Ich bin mit einem GUID-weil Sie schön und leicht zu verwalten, wenn Sie über verschiedene Umgebungen, wie z.B. "Produktion", "test" und "dev" - Datenbanken und auch für die migration von Daten zwischen Datenbanken.
Ich werde Entity Framework 4.3, und ich will ordnen Sie die Guid in die Anwendung code, vor dem einfügen in die Datenbank. (d.h. ich will nicht zu lassen, die SQL generieren der Guid).
Was ist die beste Methode zum erstellen von GUID-basierten Primären Schlüssel, um zu vermeiden, dass die vermeintliche Leistung trifft im Zusammenhang mit diesem Ansatz?
Ich würde auch hinzufügen, dass das Wort server mehrdeutig ich will ordnen Sie die Guid auf der server Seite (die nicht wollen, lassen Sie SQL zum erstellen der GUID).
Diese Frage hat parallelen zu diesem "sql-server-guid-sort-Algorithmus-warum" stackoverflow.com/questions/7810602/...
Ist dies immer noch ein problem in 2016?
InformationsquelleAutor VAAA | 2012-08-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
GUIDs zu sein scheint eine Natürliche Wahl für Ihre primary key - und wenn Sie wirklich müssen, Sie könnte wahrscheinlich argumentieren Sie für den Primärschlüssel der Tabelle. Was würde ich dringend empfehlen, nicht zu tun ist mit dem GUID-Spalte als clustering-Schlüssel, die SQL Server standardmäßig tut, wenn Sie speziell sagen, es nicht zu.
Sie wirklich brauchen, um zu halten mit zwei Fragen auseinander:
den Primärschlüssel ist eine logische Konstruktion - einer der Kandidaten-Schlüssel, die eindeutig und zuverlässig identifiziert jede Zeile in der Tabelle. Das kann alles sein, wirklich - ein
INT
eineGUID
eine string - pick, was macht am meisten Sinn für Ihr Szenario.den clustering-Schlüssel (die Spalte oder Spalten, definieren Sie die "clustered index" auf dem Tisch) - dies ist ein körperliche Speicher-bezogene Sache, und hier, einen kleinen, stabilen, ständig wachsenden Daten-Typ ist Ihre besten pick -
INT
oderBIGINT
als Standard-option.Standardmäßig den Primärschlüssel in einer SQL Server-Tabelle wird auch als clustering-Schlüssel - aber das muss nicht so sein! Ich habe persönlich gesehen, massive performance-Gewinne beim Aufbrechen der bisherigen GUID-basierten Primären Cluster-Schlüssel in zwei separate Taste - die primäre (logische) - Taste auf die GUID und das clustering (Bestell -) Schlüssel auf einem separaten
INT IDENTITY(1,1)
Spalte.Als Kimberly Tripp - die Königin der Indizierung - und andere haben erklärt, eine große viele Male - ein
GUID
als clustering-Schlüssel ist nicht optimal, da aufgrund der Zufälligkeit, es führt zu massiven Seite und index-Fragmentierung und die allgemein schlechte performance.Ja, ich weiß - es gibt
newsequentialid()
in SQL Server 2005 und up - aber auch das ist nicht wirklich und voll-sequentielle und somit leidet auch unter den gleichen Problemen wie dieGUID
- nur ein bisschen weniger prominent, so.Dann gibt es ein weiteres Problem zu berücksichtigen: die clustering-key auf eine Tabelle wird Hinzugefügt, um jede und jeden Eintrag auf jeder und jedem nicht gruppierten index für die Tabelle - so Sie wirklich wollen, um sicherzustellen, dass es so klein wie möglich. In der Regel ist ein
INT
mit 2+ Milliarden Zeilen sollte ausreichend sein, für die überwiegende Mehrheit der Tabellen - und im Vergleich zu einerGUID
als clustering-Schlüssel, Sie können sparen Sie sich Hunderte von Megabyte Speicherplatz auf der Festplatte und im Speicher des Servers.Schnelle Berechnung -
INT
vs.GUID
als Primary und Clustering-Schlüssel:INSGESAMT: 25 MB vs. 106 MB - und das ist nur auf eine einzige Tabelle!
Einige weitere Denkanstöße - gute Sachen von Kimberly Tripp - Lesen Sie es, Lesen Sie es wieder, es verdauen! Es ist der SQL Server Indizierung Evangelium, wirklich.
PS: natürlich, wenn man sich mit ein paar hundert oder ein paar tausend Zeilen - die meisten dieser Argumente nicht wirklich viel von einem Einfluss auf Sie. Allerdings: wenn man in die Dutzende, Hunderte oder Tausende von Zeilen, oder Sie mit dem zählen beginnen in Millionen - dann diese Punkte werden sehr entscheidend und sehr wichtig zu verstehen.
Update: wenn Sie wollen, um Ihre
PKGUID
Spalte als Primärschlüssel (aber nicht Ihre clustering-Schlüssel), und eine weitere SpalteMYINT
(INT IDENTITY
) als clustering-Schlüssel - verwenden Sie diese:Grundsätzlich: Sie müssen nur explizit sagen, die
PRIMARY KEY
Einschränkung, dass esNONCLUSTERED
(ansonsten erstellt Ihr gruppierten index, der von Standard) - und dann erstellen Sie eine zweite index ist definiert alsCLUSTERED
Wird diese Arbeit - und es ist eine gültige option, wenn Sie ein vorhandenes system, das muss sein "re-engineered" für die Leistung. Für ein neues system, wenn Sie von vorne anfangen, und du bist nicht in einem Replikations-Szenario, dann würde ich mir immer Holen
ID INT IDENTITY(1,1)
als meine gruppierten Primärschlüssel - viel effizienter, als alles andere!Die Art, wie ich dies Lesen, ist, dass beide einen nicht gruppierten uniqueidentifier-Spalte und der int-identity-Spalte, FK ' s sollte auch sein uniqueidentifier? Wenn Sie das tun, als würden Sie tatsächlich verwenden Sie den identity-Spalte direkt, oder würde Sie nicht?
Kleine Frage, sollte die GUID jetzt verwendet werden, auf die Verknüpfungen, oder die int-id? Mein Instinkt sagt mir der GUID verwendet werden soll, aber ich sehe nicht, ein technisches problem mit dem int-id...
aber in einem Replikations-Szenario, wenn die int-Spalte ist Identität, sollten wir nicht verwenden Sie die GUID da die int-Spalte können Sie sich über Geräte hinweg?
die wichtigsten Fragen ist die falls Sie haben so einen natürlichen Wert - dann ja, Sie können verwenden Sie es als einen primären Schlüssel. ABER: Werte wie
DATETIME
zum Beispiel sind NICHT nützlich für den clustering-Schlüssel, da Sie 3,33 ms Genauigkeit nur, und damit Duplikate existieren kann. Also in einem solchen Fall, Sie *noch brauchen Sie einINT IDENTITY
statt - daher habe ich in der Regel verwenden, die standardmäßig seit frmo meine 20+ Jahre Erfahrung, eine wirklich nutzbare Natürliche Schlüssel kaum jemals wirklich existiert ....InformationsquelleAutor marc_s
Habe ich mit GUIDs als PKs seit 2005. In dieser verteilten Datenbank-Welt, es ist absolut der beste Weg zum Zusammenführen von verteilten Daten. Sie können Feuer-und-vergessen merge-Tabellen ohne alle sorgen von ints matching über die verknüpften Tabellen. GUIDs Verknüpfungen kopiert werden kann, ohne sorgen.
Das ist mein setup für die Verwendung von GUIDs:
PK = GUID. GUIDs sind indiziert, ähnlich wie Saiten, so hohe Zeile-Tabellen (über 50 Millionen Datensätze), müssen möglicherweise die Tabelle partitionieren oder andere performance-Techniken. SQL Server ist immer äußerst effizient, so dass Leistung sorgen, sind weniger und weniger anwendbar.
PK-Guid ist NICHT Gruppierten index. Niemals cluster-index eine GUID, es sei denn, es ist NewSequentialID. Aber selbst dann, ein Neustart des Servers zu großen Pausen in der Bestellung.
Add Int ClusterID auf jeden Tisch. Dies ist die GRUPPIERTEN Index..., dass Aufträge in der Tabelle.
Beitritt auf ClusterIDs (int) effizienter ist, aber ich arbeite mit 20-30 Mio-Datensatz-Tabellen, so fügen auf GUIDs nicht sichtbar auf die Leistung auswirken. Wenn Sie möchten, dass max Leistung, verwenden Sie die ClusterID-Konzept als Primärschlüssel & join auf ClusterID.
Hier ist meine E-Mail-Tabelle...
Sie Wette. Zwei wichtigsten Dinge, die sich mit Indizes: 1. Clustered auf ClusterID - Bestellungen Ihre Tabelle auf der Festplatte (0% Fragmentierung). 2. Nicht gruppierter auf EmailID - Indizes das Feld EmailID zu beschleunigen GUID ID-lookups. Ein GUID-Feld lookup verhält sich string-ish, so eine EmailID lookup wäre langsam, ohne den index.
InformationsquelleAutor Robert J. Good
Ich bin derzeit auf der Entwicklung einer web-Anwendung mit EF-Core und auch hier ist das Muster, das ich verwenden :
Alle meine Klassen (Tabellen) und eine int-PK und FK.
Ich habe eine zusätzliche Spalte mit dem Typ Guid (erzeugt durch den c# - Konstruktor) mit einem nicht gruppierten index.
Alle joins der Tabelle im EF wird verwaltet durch die int Tasten, während alle Zugriffe von außen (Controller) sind fertig mit der Guids.
Diese Lösung ermöglicht die Anzeige des int Tasten auf urls, sondern halten das Modell sauber und schnell.
Was den Namen der Eigenschaft verwenden Sie für die Guid ein?
InformationsquelleAutor EricImhauser
Wenn du GUID als Primärschlüssel und create clustered index dann schlage ich vor, verwenden Sie die Standardeinstellung von NEWSEQUENTIALID () - Wert für es
InformationsquelleAutor AnandPhadke
Dieser link erklärt es besser als ich es könnte und geholfen in meiner Entscheidungsfindung. Ich in der Regel entscheiden Sie sich für einen int als Primärschlüssel, es sei denn, ich habe einen konkreten Bedarf nicht an und ich lass auch SQL server-auto-generate/dieses Feld Bearbeiten, es sei denn, ich habe einige bestimmten Grund nicht. In der Realität, die performance betrifft, müssen bestimmt werden, basierend auf Ihren speziellen app. Es gibt viele Faktoren, die hier im Spiel einschließlich, aber nicht beschränkt auf die erwarteten db-Größe, korrekte Indexierung, effizientes Abfragen und vieles mehr. Obwohl die Menschen vielleicht nicht einverstanden, ich denke, in vielen Szenarien werden Sie nicht bemerken einen Unterschied mit entweder die option und Sie sollten wählen, was ist besser geeignet für Ihre app und was erlaubt die Entwicklung einfacher, schneller und effektiver (Wenn Sie nicht vollständig die app was für einen Unterschied macht den rest machen :).
https://web.archive.org/web/20120812080710/http://databases.aspfaq.com/database/what-should-i-choose-for-my-primary-key.html
P. S. ich bin mir nicht sicher, warum würden Sie einen Zusammengesetzten PK oder was Sie glauben, das würden Sie.
Die PK (index) wäre aus den beiden Spalten, aber es sei denn, Sie haben einige business-spezifischen Grund für das tun dies, so scheint es unnötig.
BTW diese Frage ist eine der am meisten polarisiert und diskutiert Fragen gibt und daher extrem schwierig, um eine Antwort für Sie, dass Sie sich 100% komfortabel mit. Entweder Methode kommt mit trade-offs, also viel Glück 🙂
InformationsquelleAutor Matt
Dass sequenzielle ID ist, macht es VIEL einfacher für einen hacker oder data-miner zu gefährden, Ihre Website und die Daten. Denken Sie daran bei der Wahl einer PK für eine website.
InformationsquelleAutor DaBlue
Meisten der Zeit, sollte es nicht verwendet werden, die als Primärschlüssel für eine Tabelle, weil es wirklich der hit Datenbank-performance.
nützliche links in Bezug auf GUID Auswirkungen auf die performance und die als primary key.
InformationsquelleAutor Asrar Ahmad Ehsan