constraint_exclusion
| 버전 | 기본값 | context | 타입 |
|---|---|---|---|
| 14 | — | user | enum |
| 15 | — | user | enum |
| 16 | — | user | enum |
| 17 | — | user | enum |
| 18 | — | user | enum |
| 19 | — | user | enum |
planner가 테이블의 CHECK constraint를 쿼리 조건과 대조해, 조건과 모순되는 테이블의 scan을 plan에서 제외할지 정한다. 기본값은 partition이다.
값은 세 가지다. on은 모든 테이블에서 constraint를 검사하고, off는 전혀 검사하지 않으며, 기본값인 partition은 inheritance 자식 테이블과 UNION ALL 서브쿼리에 대해서만 검사한다. 전통적인 inheritance 기반 파티셔닝에서 planner는 쿼리 조건을 각 자식 테이블의 CHECK constraint와 비교해, 조건과 모순되는 자식 테이블을 scan 대상에서 빼 버린다. 예컨대 key 범위별로 자식 테이블을 나눠 두었다면 WHERE key = 2400 쿼리는 다른 범위의 자식 테이블을 전혀 읽지 않는다.
on으로 두어 모든 테이블을 검사하게 하면 단순 쿼리에서도 planning 오버헤드가 눈에 띄게 늘어나는 반면 이득을 보는 경우는 드물다. 선언적 partitioned table의 partition 제거는 이 파라미터가 아니라 enable_partition_pruning이 담당한다는 점도 구분해야 한다.
운영 노트: 선언적 파티셔닝만 쓰는 환경이라면 기본값 partition을 그대로 두면 된다. inheritance 파티셔닝을 전혀 쓰지 않는다면 off로 내려 planning 비용을 아낄 수 있지만, 체감 차이가 크지 않아 굳이 바꾸지 않는 경우가 대부분이다.
출처: PostgreSQL 18 문서