Eindeutige Kennung (GUID) als Primärschlüssel im Datenbankentwurf
Unsere Daten befinden sich in einer SQL Server 2008 Datenbank, es wird eine Menge von Abfragen und Beitrittes zwischen Tabellen. Wir haben dieses argument innerhalb der Mannschaft, einige sind der Meinung die Verwendung von integer-Identität ist besser für die Leistung, einige sind der Meinung die Verwendung der guid (eindeutiger Identifikator).
Macht wirklich leiden, die schlecht mit einer GUID als Primärschlüssel?
Kommentar zu dem Problem
Die größte Leistung und die Fragmentierung der Probleme mit einem
UNIQUEIDENTIFIER
wird kommen, wenn Sie tun Sie Ihre PK einen gruppierten index so gibt es Fragen, ist es wahr zu sagen immer mit int anstatt guid als pk dann? Warum kommt jeder Verwendung guid dann?
werfen Sie einen Blick auf diesen link, um zu sehen, die Auswirkungen auf die Fragmentierung, die mit
UNIQUEIDENTIFIER
sqlskills.com/blogs/paul/post/... . Auf der anderen Seite, nur selten jemanden, der verwendet UNIQUEIDENTIFIER
auf einem gruppierten index Ich benutze Sie auf clustered-Indizes regelmäßig. Die Fragmentierung Problem wird durch die Art und Weise neue Werte berechnet werden, die nicht durch die
uniqueidentifier
- Datentyp selbst. Wenn Sie Zufallszahlen für eine integer-ID, die Sie hatte das gleiche problem haben. Verwenden Sie NEWSEQUENTIALID()
oder eine KAMM-ähnliche Methode, und es sollte kein wirkliches Problem. Clustering auf eine zufällige GUID kann tatsächlich helfen, die performance, im Gegensatz zu der landläufigen Meinung, dass über eine sequentielle GUID ist besser. Die Zufälligkeit einer GUID kann tatsächlich reduzieren die Konflikte auf der letzten Seite Daten und steigern Sie die performance von Gewindeeinsätzen auf hohe I/O-Systeme erheblich. Siehe: blog.kejser.org/2011/10/05/...
InformationsquelleAutor der Frage TOMMY WANG | 2012-03-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer 128-bit-GUID (
uniqueidentifier
) Schlüssel ist natürlich 4x größer als ein 32-bit -int
- Taste. Es gibt jedoch ein paar entscheidende Vorteile:SELECT
aus den Primärschlüssel basiert auf einer Datum/Zeit-Bereich, wenn Sie wollen mit ein paar fancyCAST()
Anrufe.SELECT scope_identity()
um der primary key nach dem einfügen.bigint
(64 bit) anstelle vonint
. Sobald Sie das tun,uniqueidentifier
ist nur zweimal so groß wie einbigint
.Ende, auspressen einige kleine performance-Vorteil durch die Verwendung von ganzen zahlen möglicherweise nicht Wert verlieren die Vorteile einer GUID. Testen Sie empirisch und für sich selbst entscheiden.
Persönlich, ich benutze immer noch beide, je nach situation, aber der entscheidende Faktor, hat nie wirklich nach unten kommen, um die Leistung in meinem Fall.
InformationsquelleAutor der Antwort richardtallent
Ich persönlich benutze
INT IDENTITY
für die meisten meiner primary und clustering Schlüssel.Müssen Sie auseinander zu halten die Primärschlüssel das ist eine logische Konstruktion - die es eindeutig identifiziert Ihre Zeilen, es muss eindeutig sein und stabil
NOT NULL
. Eine GUID funktioniert gut für eine primary key -, zu - denn es ist garantiert einzigartig. Eine GUID als Primärschlüssel ist eine gute Wahl, wenn Sie SQL Server-Replikation verwenden, da in diesem Fall benötigen Sie eine eindeutige Identifizierung GUID-Spalte sowieso.Den clustering-Schlüssel in SQL Server ist ein physikalisches Konstrukt wird verwendet für die physische Reihenfolge der Daten, und ist viel schwieriger zu bekommen Recht. In der Regel, die Königin der Indizierung auf SQL Server, Kimberly Tripp, erfordert auch ein gutes clustering-Schlüssel zu eindeutigen, stabilen, möglichst schmal ist und im Idealfall stetig wachsenden (von denen alle eine
INT IDENTITY
ist).Finden Sie Ihre Artikel über die Indizierung hier:
und auch sehen, Jimmy Nilsson Die Kosten von GUIDs als Primärschlüssel
Eine GUID ist eine furchtbar schlechte Wahl für ein clustering-Schlüssel, da es weite, völlig zufällig, und führt damit zu schlechten index-Fragmentierung und schlechte Leistung. Auch der clustering-Schlüssel-Zeile(N) wird auch gespeichert, in jedem und jeder Eintrag von jeder und jedem nicht gruppierten (zusätzliche) index, also wollen Sie wirklich klein zu halten - GUID ist 16 Bytes vs. INT ist 4 byte, und mit mehreren nicht gruppierten Indizes und mehreren Millionen Zeilen, das macht einen GROßEN Unterschied.
In SQL Server, ist der primäre Schlüssel ist standardmäßig Ihre clustering-Schlüssel - aber es muss nicht sein. Sie können leicht mit einem GUID als Ihre NON-Clustered primary key, und eine
INT IDENTITY
als Ihre clustering-Schlüssel - es dauert nur ein wenig bewusst.InformationsquelleAutor der Antwort marc_s
Großen Artikel auf diese, dass ich in meinen Lesezeichen: http://blogs.msdn.com/b/sqlserverfaq/archive/2010/05/27/guid-vs-int-debate.aspx
InformationsquelleAutor der Antwort Erik
Das große problem mit GUIDs als Primärschlüssel ist, verursachen Sie massive Tisch Zersplitterung, was ein großes performance-Problem (je größer die Tabelle, desto größer das Problem). Sogar als Schlüssel für einen nicht gruppierten index, verursachen Sie index-Fragmentierung.
Kann man teilweise verringern das problem durch Einstellung eines geeigneten Füllfaktors-aber es wird noch ein Thema sein.
Den Größenunterschied stört mich nicht viel, außer auf Tische mit anders engen Zeilen, in denen table-scans sind ebenfalls erforderlich. In jenen Fällen, in der Lage zu passen mehr Zeilen pro DB-Seite ist ein performance-Vorteil.
Kann es gute Gründe für die Verwendung von GUIDs, aber es ist auch eine Kosten. Ich in der Regel lieber INT IDENTITY für Primärschlüssel, aber ich nicht vermeiden, GUIDs, wenn Sie eine bessere Lösung.
InformationsquelleAutor der Antwort RickNZ
Also sind Sie eine gute Lösung für die Fälle, wo Sie brauchen, um Zusammenführen von Daten aus mehreren Quellen
Quelle : http://www.sqlteam.com/article/uniqueidentifier-vs-identity
InformationsquelleAutor der Antwort Julien
Wenn Datenbank-Tabelle Datensätze wachsen kann, in Millionen Platten, die ich denke, es ist nicht eine gute Idee, verwenden Sie es als einen primären Schlüssel.
InformationsquelleAutor der Antwort johnpm45