473 Stimmen

Wird durch einen Fremdschlüssel automatisch ein Index erstellt?

Mir wurde gesagt, dass SQL Server so etwas wie einen Index in der untergeordneten Tabelle erstellt, wenn ich zwei Tabellen als Fremdschlüssel verwende. Es fällt mir schwer zu glauben, dass dies wahr ist, aber ich kann nicht viel finden, was sich speziell auf dieses Thema bezieht.

Der eigentliche Grund für meine Frage ist, dass wir bei einer Löschanweisung für eine Tabelle, die wahrscheinlich 15 Bezugstabellen hat, eine sehr langsame Antwortzeit haben. Ich habe unseren Datenbankspezialisten gefragt, und er sagt, wenn es einen Fremdschlüssel für die Felder gibt, dann wirkt er wie ein Index. Welche Erfahrungen haben Sie damit gemacht? Sollte ich Indizes für alle Fremdschlüsselfelder hinzufügen oder sind sie nur unnötiger Overhead?

424voto

marc_s Punkte 701497

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, die Teil einer Fremdschlüsselbeziehung sind, zu indizieren, denn durch eine FK-Beziehung müssen Sie oft eine Bezugstabelle durchsuchen und bestimmte Zeilen auf der Grundlage eines einzelnen Wertes oder eines Wertebereichs extrahieren.

Es ist also durchaus sinnvoll, alle an einer FK beteiligten Spalten zu indizieren, aber eine FK an sich ist kein Index.

Lesen Sie den ausgezeichneten Artikel von Kimberly Tripp "Wann hat SQL Server aufgehört, Indizes auf Fremdschlüsselspalten zu setzen?" .

55voto

Yishai Punkte 87548

Wow, die Antworten sind wirklich sehr unterschiedlich. Also die Dokumentation sagt:

Eine FOREIGN KEY-Beschränkung ist ein Kandidat für einen Index, weil:

  • Änderungen an PRIMARY KEY-Beschränkungen werden mit FOREIGN KEY-Beschränkungen in Bezugstabellen überprüft.

  • Fremdschlüsselspalten werden häufig in Verknüpfungskriterien verwendet, wenn die Daten aus Bezugstabellen in Abfragen kombiniert werden, indem die Spalte(n) in der FOREIGN KEY-Beschränkung einer Tabelle mit der/den Primär- oder eindeutigen Schlüsselspalte(n) der anderen Tabelle abgeglichen werden. Ein Index ermöglicht es Microsoft® SQL Server™ 2000, verwandte Daten in der Fremdschlüsseltabelle schnell zu finden. Die Erstellung dieses Indexes ist jedoch keine Voraussetzung. Daten aus zwei verwandten Tabellen können auch dann kombiniert werden, wenn keine PRIMARY KEY- oder FOREIGN KEY-Beschränkungen zwischen den Tabellen definiert sind, aber eine Fremdschlüsselbeziehung zwischen zwei Tabellen zeigt an, dass die beiden Tabellen für die Kombination in einer Abfrage, die die Schlüssel als Kriterien verwendet, optimiert wurden.

Es scheint also ziemlich klar zu sein (auch wenn die Dokumentation ein wenig verworren ist), dass es tatsächlich keinen Index erstellt.

26voto

Michael Borgwardt Punkte 334642

Nein, es gibt keinen impliziten Index für Fremdschlüsselfelder, warum würde Microsoft sonst sagen "Die Erstellung eines Indexes für einen Fremdschlüssel ist oft nützlich" . Ihr Kollege verwechselt möglicherweise das Fremdschlüsselfeld in der verweisenden Tabelle mit dem Primärschlüssel in der Tabelle, auf die verwiesen wird - Primärschlüssel do einen impliziten Index erstellen.

15voto

Sandeep Kanuri Punkte 111

Fremdschlüssel erstellen keine Indizes. Nur Alternativschlüssel-Beschränkungen (UNIQUE) und Primärschlüssel-Beschränkungen erstellen Indizes. Dies gilt für Oracle und SQL Server.

10voto

Gregor Punkte 534

In PostgeSql können Sie selbst nach Indizes suchen, indem Sie \d Tabellenname

Sie werden sehen, dass btree-Indizes automatisch für Spalten mit Primärschlüssel- und Unique-Beschränkungen erstellt wurden, aber nicht für Spalten mit Fremdschlüsseln.

Ich denke, das beantwortet Ihre Frage, zumindest für Postgres.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X