In PostgreSQL-Dokumenten für Constraints heißt es
Eine Nicht-Null-Einschränkung ist funktional äquivalent zum Erstellen einer Prüfeinschränkung
CHECK (column_name IS NOT NULL)
, aber in PostgreSQL ist das Erstellen einer expliziten Nicht-Null-Einschränkung effizienter.
ich frage mich
- Was genau bedeutet "effizienter"?
- Was sind die Nachteile von
CHECK (column_name IS NOT NULL)
stattSET NOT NULL
?
Ich möchte eine NOT VALID
CHECK
Einschränkung hinzufügen und separat validieren können (daher wird die Einschränkung AccessExclusiveLock
nur für einen kurzen Zeitraum zum Hinzufügen und dann ShareUpdateExclusiveLock
für den längeren Validierungsschritt angehalten):
ALTER TABLE table_name
ADD CONSTRAINT column_constraint
CHECK (column_name IS NOT NULL)
NOT VALID;
ALTER TABLE table_name
VALIDATE CONSTRAINT column_constraint;
Anstatt von:
ALTER TABLE table_name
ALTER COLUMN column_name
SET NOT NULL;
postgresql
postgresql-9.5
check-constraints
Robin Joseph
quelle
quelle
not in
bei beiden Varianten aus? Sind sie gleich oder unterscheiden sie sich?Antworten:
Meine wilde Vermutung: "effizienter" bedeutet "weniger Zeit wird benötigt, um die Prüfung durchzuführen" (Zeitvorteil). Dies kann auch bedeuten, dass "weniger Speicher erforderlich ist, um die Prüfung durchzuführen" (Platzvorteil). Es könnte auch bedeuten, dass "weniger Nebenwirkungen" vorliegen (z. B., dass etwas nicht gesperrt oder für kürzere Zeit gesperrt wird) ... aber ich habe keine Möglichkeit, diesen "zusätzlichen Vorteil" zu kennen oder zu überprüfen.
Ich kann mir keinen einfachen Weg vorstellen, um nach einem möglichen Platzvorteil zu suchen (was, denke ich, nicht so wichtig ist, wenn Speicher heutzutage billig ist). Auf der anderen Seite ist es nicht so schwierig, den möglichen Zeitvorteil zu überprüfen: Erstellen Sie nur zwei Tabellen, die mit Ausnahme der Einschränkung identisch sind. Fügen Sie eine ausreichend große Anzahl von Zeilen ein, wiederholen Sie diese einige Male und überprüfen Sie die Timings.
Dies ist die Tabelleneinstellung:
Dies ist eine zusätzliche Tabelle zum Speichern von Timings:
Und dies ist der Test, der mit pgAdmin III und der pgScript-Funktion durchgeführt wurde .
Das Ergebnis ist in der folgenden Abfrage zusammengefasst:
Mit folgenden Ergebnissen:
Ein Diagramm der Werte zeigt eine wichtige Variabilität:
In der Praxis ist CHECK (Spalte IST NICHT NULL) also etwas langsamer (um 0,5%). Dieser kleine Unterschied kann jedoch auf einen beliebigen Grund zurückzuführen sein, vorausgesetzt, die Variabilität der Zeitabläufe ist weitaus größer. Es ist also statistisch nicht signifikant.
Aus praktischer Sicht würde ich das "effizientere" System sehr ignorieren
NOT NULL
, da ich nicht wirklich sehe, dass es von Bedeutung ist. Ich halte das FehlenAccessExclusiveLock
eines von Vorteil.quelle