Ich habe dies über das SQL-Schlüsselwort DEFERRABLE
in Database Systems - The Complete Book gelesen .
Letzteres [NOT DEFERRABLE] ist die Standardeinstellung und bedeutet, dass jedes Mal, wenn eine Datenbankänderungsanweisung ausgeführt wird, die Einschränkung unmittelbar danach überprüft wird, ob die Änderung die Fremdschlüsseleinschränkung verletzen könnte.
Wenn wir jedoch eine Einschränkung als DEFERRABLE deklarieren , haben wir die Möglichkeit, sie warten zu lassen, bis eine Transaktion abgeschlossen ist, bevor wir die Einschränkung überprüfen.
Wir folgen dem Schlüsselwort DEFERRABLE entweder INITIALLY DEFERRED oder INITIALLY IMMEDIATE . Im ersteren Fall wird die Überprüfung auf kurz vor jeder Commit-Transaktion verschoben. Im letzteren Fall erfolgt die Prüfung unmittelbar nach jeder Abrechnung.
Wie NOT DEFERRABLE
unterscheidet sich von DEFERRABLE INITIALLY IMMEDIATE
? In beiden Fällen werden anscheinend alle Einschränkungen nach jeder einzelnen Anweisung überprüft.
DEFERRABLE
die Absicht des Designers an, dass das Aufschieben der Einschränkung eine lohnende oder notwendige Maßnahme ist. Dies ist bei der überwiegenden Mehrheit der Datenbankbeschränkungen und Beschriftungen nicht der Fall, daDEFERRABLE
diese nützliche Unterscheidung verloren gehen würde.NOT DEFERRABLE
ist normalerweise die schnellste.Abgesehen von den anderen (richtigen) Antworten muss bei PostgreSQL Folgendes angegeben werden:
Mit NOT DEFERRABLE wird jede Zeile beim Einfügen / Aktualisieren überprüft
Mit DEFERRABLE (derzeit SOFORT ) werden alle Zeilen am Ende des Einfügens / Aktualisierens überprüft
Mit DEFERRABLE (derzeit DEFERRED ) werden alle Zeilen am Ende der Transaktion überprüft
So ist es nicht richtig zu sagen , dass ein DEFERRABLE Zwang wirkt wie ein NOT DEFERRABLE ein , wenn es um SOFORT eingestellt ist.
Lassen Sie uns diesen Unterschied näher erläutern:
Dies gibt korrekt aus:
Wenn wir jedoch die Anweisung DEFERRABLE INITIALLY SOFORT entfernen,
ADDENDUM (12. Oktober 2017)
Dieses Verhalten ist in der Tat hier im Abschnitt "Kompatibilität" dokumentiert :
quelle
NOT DEFERRABLE
die Geschwindigkeit ( siehe hier , Abschnitt Nicht verzögerte Eindeutigkeitsbeschränkungen , " Beachten Sie , dass dies erheblich langsamer sein kann als die sofortige Überprüfung der Eindeutigkeit" ).DEFERRABLE
Einschränkung in anderen Tabellen nicht als Fremdschlüssel referenziert werden ( siehe hier , Abschnitt Parameter , "Die referenzierten Spalten müssen die Spalten einer nicht aufschiebbaren eindeutigen oder Primärschlüsseleinschränkung in der referenzierten Tabelle sein" ).NOT DEFERRABLE
nur verwenden, weil es eine bessere Leistung erbringt.NOT DEFERRABLE
2) Wenn mindestens eine FK auf die Einschränkung verweist, verwenden wirNOT DEFERRABLE
auch 3) in den anderen Fällen verwenden wirDEFERRABLE INITIALLY IMMEDIATE
. Dies könnte die Leistung dieser Einschränkungen geringfügig verringern, gewährleistet jedoch maximale Kompatibilität mit anderen von uns verwendeten DBMS (Oracle, SqlServer). PK und FK sind kein Problem, da wir ihre Werte nie aktualisieren (was meiner Meinung nach eine gute Programmiergewohnheit für DBs ist).Abgesehen von der offensichtlichen Fähigkeit, aufzuschieben, ist der Unterschied tatsächlich die Leistung. Wenn es keine Leistungseinbußen gäbe, wäre es nicht erforderlich, eine Option zu haben, um aufschiebbar zu wählen oder nicht - alle Einschränkungen wären einfach aufschiebbar.
Der Leistungsverlust hat mit Optimierungen zu tun, die die Datenbank ausführen kann, wenn bekannt ist, wie die Daten eingeschränkt sind. Beispielsweise kann der Index, der zum Sichern einer eindeutigen Einschränkung in Oracle erstellt wird, kein eindeutiger Index sein, wenn die Einschränkung aufschiebbar ist, da das vorübergehende Zulassen von Duplikaten zulässig sein muss. Wenn die Einschränkung jedoch nicht aufschiebbar ist, kann der Index eindeutig sein.
quelle
Ich bin sehr spät zur Party, aber ich wollte hinzufügen, dass ab Dezember 2018 nur zwei mir bekannte Datenbanken (möglicherweise mehr) eine gewisse Implementierungsstufe für diese Standard-SQL-Funktion bieten :
* 1 Obwohl Oracle 12c den
NOT DEFERRABLE
Einschränkungsstatus akzeptiert , ignoriert es ihn tatsächlich und lässt ihn so funktionierenDEFERRABLE INITIALLY IMMEDIATE
.Wie Sie sehen, implementiert Oracle den ersten Typ (
NOT DEFERRABLE
) nicht. Aus diesem Grund können Entwickler, die Oracle verwenden (in diesem Fall das OP), verwirrt sein und die ersten beiden Typen als gleichwertig betrachten.Interessanterweise haben Oracle und PostgreSQL einen anderen Standardtyp. Vielleicht hat es Auswirkungen auf die Leistung.
quelle
NICHT VERZÖGERBAR - Sie können die Einschränkungsprüfung nicht ändern. Oracle überprüft sie nach jeder Anweisung (dh direkt nach der Einfügeanweisung).
DEFERRABLE INITIALLY SOFORT - Oracle überprüft die Einschränkung nach jeder Anweisung. ABER Sie können es nach jeder Transaktion ändern (dh nach dem Festschreiben):
quelle