Angenommen, ich habe eine ID-Zeile (int) in einer Datenbank als Primärschlüssel festgelegt. Wenn ich die ID häufig abfrage, muss ich sie auch indizieren? Oder bedeutet es als Primärschlüssel, dass er bereits indiziert ist?
Der Grund, den ich frage, ist, dass ich in MS SQL Server einen Index für diese ID erstellen kann, der, wie angegeben, mein Primärschlüssel ist.
Bearbeiten: eine zusätzliche Frage - schadet es, den Primärschlüssel zusätzlich zu indizieren?
quelle
Wie alle anderen bereits gesagt haben, werden Primärschlüssel automatisch indiziert.
Das Erstellen weiterer Indizes für die Primärschlüsselspalte ist nur dann sinnvoll, wenn Sie eine Abfrage optimieren müssen, die den Primärschlüssel und einige andere spezifische Spalten verwendet. Indem Sie einen weiteren Index für die Primärschlüsselspalte erstellen und einige andere Spalten hinzufügen, können Sie die gewünschte Optimierung für eine Abfrage erreichen.
Sie haben beispielsweise eine Tabelle mit vielen Spalten, fragen jedoch nur die Spalten ID, Name und Adresse ab. Mit der ID als Primärschlüssel können wir den folgenden Index erstellen, der auf der ID basiert, jedoch die Spalten Name und Adresse enthält.
Wenn Sie diese Abfrage verwenden:
SQL Server gibt das Ergebnis nur anhand des von Ihnen erstellten Index aus und liest nichts aus der tatsächlichen Tabelle.
quelle
HINWEIS: Diese Antwort Adressen der Enterprise-Klasse Entwicklung in-the-large .
Dies ist ein RDBMS-Problem, nicht nur SQL Server, und das Verhalten kann sehr interessant sein. Zum einen ist es üblich, dass Primärschlüssel automatisch (eindeutig) indiziert werden, aber NICHT absolut. Es gibt Zeiten, in denen es wichtig ist, dass ein Primärschlüssel NICHT eindeutig indiziert wird.
In den meisten RDBMS wird automatisch ein eindeutiger Index für einen Primärschlüssel erstellt, sofern noch keiner vorhanden ist . Daher können Sie einen eigenen Index für die Primärschlüsselspalte erstellen, bevor Sie ihn als Primärschlüssel deklarieren. Dieser Index wird dann (falls akzeptabel) vom Datenbankmodul verwendet, wenn Sie die Primärschlüsseldeklaration anwenden. Oft können Sie den Primärschlüssel erstellen und zulassen, dass sein eindeutiger Standardindex erstellt wird. Erstellen Sie dann Ihren eigenen alternativen Index für diese Spalte und löschen Sie den Standardindex.
Nun zum lustigen Teil - wann möchten Sie KEINEN eindeutigen Primärschlüsselindex? Sie möchten keine und können keine tolerieren, wenn Ihre Tabelle genügend Daten (Zeilen) erfasst, um die Pflege des Index zu teuer zu machen. Dies hängt von der Hardware, der RDBMS-Engine, den Eigenschaften der Tabelle und der Datenbank sowie der Systemlast ab. Es beginnt sich jedoch normalerweise zu manifestieren, sobald eine Tabelle einige Millionen Zeilen erreicht.
Das wesentliche Problem besteht darin, dass jede Einfügung einer Zeile oder Aktualisierung der Primärschlüsselspalte zu einem Index-Scan führt, um die Eindeutigkeit sicherzustellen. Dieser eindeutige Index-Scan (oder dessen Äquivalent in jedem RDBMS) wird mit zunehmendem Wachstum der Tabelle viel teurer, bis er die Leistung der Tabelle dominiert.
Ich habe dieses Problem viele Male mit Tabellen behandelt, die zwei Milliarden Zeilen, 8 TB Speicher und vierzig Millionen Zeileneinfügungen pro Tag umfassen. Ich wurde beauftragt, das betreffende System neu zu gestalten, wobei der eindeutige Primärschlüsselindex praktisch als erster Schritt gelöscht wurde. In der Tat war es notwendig, diesen Index in der Produktion zu löschen, um sich von einem Ausfall zu erholen, bevor wir uns überhaupt einer Neugestaltung näherten. Diese Neugestaltung beinhaltete die Suche nach anderen Möglichkeiten, um die Eindeutigkeit des Primärschlüssels sicherzustellen und einen schnellen Zugriff auf die Daten zu ermöglichen.
quelle
IDENTITY
ist nicht garantiert, dass ein Feld eindeutig ist. Schließlich können Benutzer doppelte Werte einfügen, wenn sie Benutzer sindIDENTITY_INSERT
.Primärschlüssel werden standardmäßig immer indiziert.
http://technet.microsoft.com/en-us/library/ms189039.aspx
quelle
Hier die Passage aus dem MSDN :
quelle
Eine PK wird zu einem Clustered-Index, sofern Sie nicht Nonclustered angeben
quelle
Durch das Deklarieren einer
PRIMARY KEY
oder einerUNIQUE
Einschränkung erstellt SQL Server automatisch einen Index.Ein eindeutiger Index kann ohne Übereinstimmung mit einer Einschränkung erstellt werden, aber eine Einschränkung (entweder Primärschlüssel oder eindeutig) kann nicht ohne einen eindeutigen Index vorhanden sein.
Von hier aus wird die Erstellung einer Einschränkung:
Wenn Sie gleichzeitig die Einschränkung löschen, wird der zugehörige Index gelöscht.
Gibt es also einen tatsächlichen Unterschied zwischen a
PRIMARY KEY
oderUNIQUE INDEX
:NULL
Werte sindPRIMARY KEY
imUNIQUE
Index nicht zulässig , aber im Index zulässig . und wie bei Mengenoperatoren (UNION, EXCEPT, INTERSECT),NULL = NULL
was bedeutet, dass Sie nur einen Wert haben können, da zweiNULL
s als Duplikate voneinander gefunden werden;PRIMARY KEY
Pro Tabelle darf nur einer vorhanden sein, während 999 eindeutige Indizes erstellt werden könnenPRIMARY KEY
Einschränkung erstellt wird, wird sie als Cluster erstellt, es sei denn, die Tabelle enthält bereits einen Clustered-Index oderNONCLUSTERED
wird in ihrer Definition verwendet. Wenn einUNIQUE
Index erstellt wird, wird er so erstellt, als wäreNONCLUSTERED
er nicht spezifischCLUSTERED
und existiert bereits nicht.quelle
Wenn Sie es zu einem Primärschlüssel machen, sollte automatisch ein Index dafür erstellt werden.
quelle
In SQL Server wird der Primärschlüssel im Allgemeinen automatisch indiziert. Dies ist wahr, garantiert jedoch keine schnellere Abfrage. Der Primärschlüssel bietet eine hervorragende Leistung, wenn nur 1 Feld als Primärschlüssel vorhanden ist. Wenn jedoch mehrere Felder als Primärschlüssel vorhanden sind, basiert der Index auf diesen Feldern.
Beispiel: Feld A, B, C sind der Primärschlüssel. Wenn Sie also eine Abfrage basierend auf diesen drei Feldern in Ihrer WHERE-Klausel durchführen, ist die Leistung gut, ABER wenn Sie mit dem Feld Nur C in der WHERE-Klausel abfragen möchten wird keine gute Leistung bekommen. Um Ihre Leistung zum Laufen zu bringen, müssen Sie das C-Feld manuell indizieren.
Meistens wird das Problem erst angezeigt, wenn Sie mehr als 1 Million Datensätze erreicht haben.
quelle
Ich habe eine riesige Datenbank ohne (separaten) Index.
Jedes Mal, wenn ich nach dem Primärschlüssel abfrage, sind die Ergebnisse für alle intensiven Zwecke sofort verfügbar.
quelle
Primärschlüssel werden automatisch indiziert
Sie können mit dem pk je nach Verwendung zusätzliche Indizes erstellen
quelle