Version de PostgreSQL:

constraint_exclusion

paramètre de configuration constraint_exclusion

Contrôle l'utilisation par le planificateur de requête des contraintes pour optimiser les requêtes. Les valeurs autorisées de constraint_exclusion sont on (examiner les contraintes pour toutes les tables), off (ne jamais examiner les contraintes) et partition (n'examiner les contraintes que pour les tables enfants d'un héritage et pour les sous-requêtes UNION ALL). partition est la valeur par défaut. C'est souvent utilisé avec l'héritage et les tables partitionnées pour améliorer les performances.

Quand ce paramètre l'autorise pour une table particulière, le planificateur compare les conditions de la requête avec les contraintes CHECK sur la table, et omet le parcourt des tables pour lesquelles les conditions contredisent les contraintes. Par exemple : CREATE TABLE parent(clef integer, ...);CREATE TABLE fils1000(check (clef between 1000 and 1999)) INHERITS(parent);CREATE TABLE fils2000(check (clef between 2000 and 2999)) INHERITS(parent);...SELECT * FROM parent WHERE clef = 2400; Avec l'activation de l'exclusion par contraintes, ce SELECT ne parcourt pas fils1000, ce qui améliore les performances.

À l'heure actuelle, l'exclusion de contraintes est activée par défaut seulement pour les cas qui sont souvent utilisés pour implémenter le partitionnement de tables. L'activer pour toutes les tables impose un surcoût pour la planification qui est assez mesurable pour des requêtes simples, et le plus souvent n'apportera aucun bénéfice aux requêtes simples. Si vous n'avez pas de tables partitionnées, vous voudrez peut-être le désactiver entièrement.

Reportez vous à ddl-partitioning-constraint-exclusion pour plus d'informations sur l'utilisation d'exclusion de contraintes et du partitionnement.

Recommandations [EN]

Default of “partition” is fine for most users. Setting it to “on” can allow optimization of UNION queries as well, but deserves testing before production deployment.

Commentaires