2016-04-13 5 views
0

Ich habe kürzlich eine manuelle Löschkaskade in Postgres implementiert. Ich habe pg_depend und DFS über diese Tabelle verwendet, um die Hierarchie von den Objekten zu erhalten, aber sie ist nicht so schnell wie die eigene Implementierung von Postgres. Wie implementiert Postgres das intern?Wie implementiert Postgres intern eine Löschkaskade?

+0

Überprüfen Sie den Quellcode: http://www.postgresql.org/ftp/source/ –

Antwort

1

PostgreSQLs Implementierung der Update/Delete-Kaskade ist sehr einfach. Es ist im Grunde ein for each row ... on delete ... execute procedure ... Trigger, der herausgreift und eine delete from only [othertable] where [foreign_key_col] = OLD.[primary_key_col] tut. Es gibt ein paar Tricks, die für Trigger auf Benutzerebene nicht verfügbar sind, aber das ist das Wesentliche.

Weitere Informationen finden Sie unter RI_FKey_cascade_del in src/backend/utils/adt/ri_triggers.c.

Leistung ist in Ordnung, wenn es einen Index auf der fremden (referenzierenden) Seite einer FK-Beziehung gibt, und wirklich schrecklich, wenn die referenzierende Seite eine große Tabelle ohne Index für die referenzierende Spalte ist.

PostgreSQL (oder mindestens 9.6 und Oler) ist nicht schlau genug, um Schlüssel zu loeschen und einen einzigen grossen DELETE FROM zu machen. Es kann die ausstehenden Löschschlüssel in einem Tupelspeicher nicht ansammeln. Es muss jedes Löschen sofort versenden oder (falls die FK-Beziehung aufgeschoben wird) es in einer Warteschlange von Auslösern sammeln, die noch einzeln ausgelöst werden.

sollten Sie in der Lage sein zu leicht die Leistung einer Kaskade löschen schlugen von DELETE ... FROM ... USING ... oder ein DELETE ... WHERE EXISTS (...) zu Charge Löschen von Zeilen verwenden Sie dann aus der übergeordneten Tabelle löschen.

+0

9.6? Die neueste Version ist 9.5 – Elad

+0

@Elad 9.6 nur Hit Feature Freeze, mit Beta geplant. So 9.6 wird auch keine solche Fähigkeit haben. –

+0

@CraigRinger danke für die Hilfe, ich hatte schon in so etwas gedacht ist wirklich ein guter und einfacher Trick. –

Verwandte Themen