PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres und Indizes für Fremdschlüssel und Primärschlüssel

PostgreSQL erstellt automatisch Indizes für Primärschlüssel und Unique Constraints, aber nicht auf der referenzierenden Seite von Fremdschlüsselbeziehungen.

Wenn Pg einen impliziten Index erstellt, wird ein NOTICE ausgegeben -Level-Nachricht, die Sie in psql sehen können und/oder die Systemprotokolle, damit Sie sehen können, wann es passiert. Automatisch erstellte Indizes sind in \d sichtbar Ausgabe auch für eine Tabelle.

Die Dokumentation zu eindeutigen Indizes sagt:

PostgreSQL erstellt automatisch einen Index für jede Eindeutigkeitsbeschränkung und Primärschlüsselbeschränkung, um die Eindeutigkeit zu erzwingen. Daher ist es nicht notwendig, explizit einen Index für Primärschlüsselspalten zu erstellen.

und die Dokumentation zu Einschränkungen sagt:

Da ein DELETE einer Zeile aus der referenzierten Tabelle oder ein UPDATE einer referenzierten Spalte einen Scan der referenzierenden Tabelle nach Zeilen erfordert, die mit dem alten Wert übereinstimmen, ist es oft eine gute Idee, die referenzierenden Spalten zu indizieren. Da dies nicht immer erforderlich ist und viele Möglichkeiten zur Indexierung zur Verfügung stehen, erstellt die Deklaration einer Fremdschlüsselbeschränkung nicht automatisch einen Index für die referenzierenden Spalten.

Daher müssen Sie selbst Indizes für Fremdschlüssel erstellen, wenn Sie dies wünschen.

Beachten Sie, dass Sie bei Verwendung von Primär-Fremdschlüsseln wie 2 FKs als PK in einer M-zu-N-Tabelle einen Index auf dem PK haben und wahrscheinlich keine zusätzlichen Indizes erstellen müssen.

Obwohl es normalerweise eine gute Idee ist, einen Index für (oder einschließlich) Ihrer referenzierenden Fremdschlüsselspalten zu erstellen, ist dies nicht erforderlich. Jeder Index, den Sie hinzufügen, verlangsamt die DML-Vorgänge leicht, sodass Sie bei jedem INSERT Leistungseinbußen zahlen , UPDATE oder DELETE . Wenn der Index selten verwendet wird, lohnt es sich möglicherweise nicht, ihn zu haben.