Mir wurde gesagt, dass SQL Server, wenn ich zwei Fremdschlüssel-Tabellen verwende, einen Index in der untergeordneten Tabelle erstellt. Es fällt mir schwer zu glauben, dass dies wahr ist, aber ich kann dort nicht viel herausfinden, was speziell damit zusammenhängt.
Mein eigentlicher Grund, dies zu fragen, ist, dass in einer Löschanweisung für eine Tabelle mit wahrscheinlich 15 verwandten Tabellen eine sehr langsame Antwortzeit auftritt. Ich habe unseren Datenbank-Mitarbeiter gefragt, und er sagt, wenn sich ein Fremdschlüssel in den Feldern befindet, verhält er sich wie ein Index. Wie ist Ihre Erfahrung damit? Sollte ich Indizes für alle Fremdschlüsselfelder hinzufügen oder sind sie nur unnötiger Aufwand?
sql-server
Nick DeVore
quelle
quelle
Antworten:
Ein Fremdschlüssel ist eine Einschränkung, eine Beziehung zwischen zwei Tabellen - das hat nichts mit einem Index an sich zu tun.
Es ist jedoch bekannt, dass es sehr sinnvoll ist, alle Spalten zu indizieren, die Teil einer Fremdschlüsselbeziehung sind, da Sie bei einer FK-Beziehung häufig eine zugehörige Tabelle nachschlagen und bestimmte Zeilen basierend darauf extrahieren müssen ein einzelner Wert oder ein Wertebereich.
Es ist also sinnvoll, alle an einem FK beteiligten Spalten zu indizieren, aber ein FK an sich ist kein Index.
Lesen Sie Kimberly Tripps hervorragenden Artikel "Wann hat SQL Server aufgehört, Indizes für Fremdschlüsselspalten zu erstellen?" .
quelle
REFERENCES
. Es erstellt automatisch einenUNIQUE
Index für einePRIMARY KEY
oder eineUNIQUE
Einschränkung und erfordert, dass einUNIQUE
Index für das referenzierte Ende einer Fremdschlüsselbeziehung vorhanden ist, tut jedoch nichts automatisch für das referenzierende Ende, obwohl es oft eine gute Idee ist , einen Index selbst zu erstellen . Siehe stackoverflow.com/questions/970562/…Wow, die Antworten sind überall auf der Karte. Die Dokumentation sagt also:
Eine FOREIGN KEY-Einschränkung ist ein Kandidat für einen Index, weil:
Änderungen an PRIMARY KEY-Einschränkungen werden mit FOREIGN KEY-Einschränkungen in verwandten Tabellen überprüft.
Fremdschlüsselspalten werden häufig in Verknüpfungskriterien verwendet, wenn die Daten aus verwandten Tabellen in Abfragen kombiniert werden, indem die Spalte (n) in der FOREIGN KEY-Einschränkung einer Tabelle mit der Primär- oder eindeutigen Schlüsselspalte (n) in der anderen Tabelle abgeglichen werden. Ein Index ermöglicht es Microsoft® SQL Server ™ 2000, verwandte Daten in der Fremdschlüsseltabelle schnell zu finden. Das Erstellen dieses Index ist jedoch nicht erforderlich. Daten aus zwei verwandten Tabellen können kombiniert werden, auch wenn zwischen den Tabellen keine Einschränkungen für PRIMARY KEY oder FOREIGN KEY definiert sind. Eine Fremdschlüsselbeziehung zwischen zwei Tabellen zeigt jedoch an, dass die beiden Tabellen für die Kombination in einer Abfrage optimiert wurden, bei der die Schlüssel als verwendet werden seine Kriterien.
Es scheint also ziemlich klar zu sein (obwohl die Dokumentation etwas durcheinander ist), dass tatsächlich kein Index erstellt wird.
quelle
Nein, es gibt keinen impliziten Index für Fremdschlüsselfelder, warum sonst würde Microsoft sagen , „einen Index auf einem Fremdschlüssel zu erstellen ist oft nützlich“ . Ihr Kollege kann mit dem Primärschlüssel in dem genannten zu Tabelle mit dem Fremdschlüsselfeld in der verweisenden Tabelle verwirrend sein - Primärschlüssel hat einen impliziten Index erstellen.
quelle
SQL Server erstellt automatisch Indizes für Primärschlüssel, jedoch nicht für Fremdschlüssel. Erstellen Sie den Index für die Fremdschlüssel. Es ist wahrscheinlich den Aufwand wert.
quelle
Angenommen, Sie haben einen großen Tisch namens Bestellungen und einen kleinen Tisch namens Kunden. Es gibt einen Fremdschlüssel von einer Bestellung an einen Kunden. Wenn Sie nun einen Kunden löschen, muss SQL Server überprüfen, ob keine verwaisten Bestellungen vorhanden sind. Wenn dies der Fall ist, wird ein Fehler ausgegeben.
Um zu überprüfen, ob Bestellungen vorliegen, muss SQL Server die Tabelle mit den großen Bestellungen durchsuchen. Wenn es nun einen Index gibt, ist die Suche schnell. Ist dies nicht der Fall, ist die Suche langsam.
In diesem Fall könnte das langsame Löschen durch das Fehlen eines Index erklärt werden. Vor allem, wenn SQL Server 15 große Tabellen ohne Index durchsuchen müsste.
PS Wenn der Fremdschlüssel ON DELETE CASCADE hat, muss SQL Server weiterhin die Auftragstabelle durchsuchen, dann aber alle Bestellungen entfernen, die auf den gelöschten Kunden verweisen.
quelle
Fremdschlüssel erstellen keine Indizes. Nur alternative Schlüsseleinschränkungen (EINZIGARTIG) und Primärschlüsseleinschränkungen erstellen Indizes. Dies gilt für Oracle und SQL Server.
quelle
Meines Wissens nicht. Ein Fremdschlüssel fügt nur die Einschränkung hinzu, dass der Wert im untergeordneten Schlüssel auch irgendwo in der übergeordneten Spalte dargestellt wird. Es sagt der Datenbank nicht, dass der untergeordnete Schlüssel auch indiziert werden muss, nur eingeschränkt.
quelle
Genau genommen haben Fremdschlüssel absolut nichts mit Indizes zu tun, ja. Aber, wie die Sprecher über mir betonten, ist es sinnvoll, einen zu erstellen, um die FK-Suche zu beschleunigen. Wenn Sie in MySQL in Ihrer FK-Deklaration keinen Index angeben, erstellt die Engine (InnoDB) diesen automatisch für Sie.
quelle
In PostgeSql können Sie selbst nach Indizes suchen, wenn Sie auf \ d Tabellenname klicken
Sie werden sehen, dass btree-Indizes automatisch für Spalten mit Primärschlüssel und eindeutigen Einschränkungen erstellt wurden, jedoch nicht für Spalten mit Fremdschlüsseln.
Ich denke, das beantwortet deine Frage zumindest für Postgres.
quelle
Ich stelle fest, dass Entity Framework 6.1, auf das MSSQL verweist, automatisch Indizes für Fremdschlüssel hinzufügt.
quelle
InnoDB benötigt Indizes für Fremdschlüssel und referenzierte Schlüssel, damit Fremdschlüsselprüfungen schnell durchgeführt werden können und kein Tabellenscan erforderlich ist. In der Referenzierungstabelle muss ein Index vorhanden sein, in dem die Fremdschlüsselspalten als erste Spalten in derselben Reihenfolge aufgeführt sind.
quelle