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?
Antwort
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.
9.6? Die neueste Version ist 9.5 – Elad
@Elad 9.6 nur Hit Feature Freeze, mit Beta geplant. So 9.6 wird auch keine solche Fähigkeit haben. –
@CraigRinger danke für die Hilfe, ich hatte schon in so etwas gedacht ist wirklich ein guter und einfacher Trick. –
- 1. Wie wird Referenz intern implementiert?
- 2. Implementiert ldstr intern newobj?
- 3. Wie werden Java-Schnittstellen intern implementiert? (VTabellen?)
- 4. Wie wird die Java # intern() Methode implementiert?
- 5. Warum java.util.concurrent.atomic.AtomicBoolean wird intern mit int implementiert?
- 6. MySQL bei Löschkaskade. Testbeispiel
- 7. Wie werden Hash-Tabellen intern in gängigen Sprachen implementiert?
- 8. Wie benannte Tupel intern in Python implementiert werden?
- 9. Wie genau wird die Abhängigkeitsinjektion intern in Spring.net implementiert?
- 10. Welche Scala-Funktionen werden intern durch Reflektion implementiert?
- 11. Wie funktionieren Datenbanken intern?
- 12. Wie funktioniert Stringstream intern?
- 13. Wie ist (,) intern definiert?
- 14. Wie funktioniert Firebug intern?
- 15. Wie funktionieren Intents intern?
- 16. Wie funktioniert printf intern?
- 17. Wie wird set() implementiert?
- 18. Wie funktioniert die Java-Serialisierung intern?
- 19. Wie man eine Kommentarbenachrichtigung implementiert?
- 20. Wie speichert MySQL Timestamps intern?
- 21. Wie ASP.net-Bundling intern arbeitet
- 22. Wie speichert Python Listen intern?
- 23. Wie generisches Objekt in Java implementiert wird, implementiert eine Schnittstelle
- 24. Wie funktioniert PHP-PDO intern?
- 25. Wie twittern Bootstrap Arbeit intern
- 26. Wie speichert Neo4j Daten intern?
- 27. Wie funktioniert JS Promises intern?
- 28. Wie werden Bignums intern dargestellt?
- 29. Wie funktionieren Spring-Aspekte intern?
- 30. Hash: Wie funktioniert es intern?
Überprüfen Sie den Quellcode: http://www.postgresql.org/ftp/source/ –