Dans les documents PostgreSQL pour les contraintes , il est dit
Une contrainte non nulle est fonctionnellement équivalente à la création d'une contrainte de vérification
CHECK (column_name IS NOT NULL)
, mais dans PostgreSQL, la création d'une contrainte explicite non nulle est plus efficace.
je me demande
- Que signifie exactement «plus efficace»?
- Quels sont les inconvénients d'utiliser
CHECK (column_name IS NOT NULL)
au lieu deSET NOT NULL
?
Je veux pouvoir ajouter une NOT VALID
CHECK
contrainte et la valider séparément (de sorte que le AccessExclusiveLock
n'est maintenu que pendant une courte période de temps pour l'ajout de la contrainte, puis un ShareUpdateExclusiveLock
est maintenu pendant l'étape de validation la plus longue):
ALTER TABLE table_name
ADD CONSTRAINT column_constraint
CHECK (column_name IS NOT NULL)
NOT VALID;
ALTER TABLE table_name
VALIDATE CONSTRAINT column_constraint;
Au lieu de:
ALTER TABLE table_name
ALTER COLUMN column_name
SET NOT NULL;
postgresql
postgresql-9.5
check-constraints
Robin Joseph
la source
la source
not in
avec les deux variantes? Sont-ils identiques ou diffèrent-ils?Réponses:
Ma conjecture sauvage: "plus efficace" signifie "moins de temps est nécessaire pour effectuer la vérification" (avantage de temps). Cela peut également signifier «moins de mémoire est nécessaire pour effectuer la vérification» (avantage d'espace). Cela pourrait également signifier "a moins d'effets secondaires" (comme ne pas verrouiller quelque chose ou le verrouiller pour des périodes de temps plus courtes) ... mais je n'ai aucun moyen de connaître ou de vérifier cet "avantage supplémentaire".
Je ne peux pas penser à un moyen facile de vérifier un éventuel avantage d'espace (ce qui, je suppose, n'est pas si important lorsque la mémoire est bon marché de nos jours). D'un autre côté, ce n'est pas si difficile de vérifier le gain de temps possible: il suffit de créer deux tables qui sont les mêmes, à la seule exception de la contrainte. Insérez un nombre suffisamment important de lignes, répétez plusieurs fois et vérifiez les horaires.
Voici la configuration de la table:
Il s'agit d'un tableau supplémentaire, utilisé pour stocker les horaires:
Et c'est le test effectué, en utilisant pgAdmin III et la fonctionnalité pgScript .
Le résultat est résumé dans la requête suivante:
Avec les résultats suivants:
Un graphique des valeurs montre une variabilité importante:
Ainsi, en pratique, le CHECK (colonne IS NOT NULL) est très légèrement plus lent (de 0,5%). Cependant, cette petite différence peut être due à une raison aléatoire, à condition que la variabilité des timings soit bien plus importante que cela. Ce n'est donc pas statistiquement significatif.
D'un point de vue pratique, j'ignorerais beaucoup le "plus efficace"
NOT NULL
, car je ne vois pas vraiment qu'il est significatif; alors que je pense que l'absence d'unAccessExclusiveLock
est un avantage.la source