タイプ: | enum |
デフォルト: | partition |
コンテキスト: | user |
再起動: | false |
値: | [partition, on, off] |
問い合わせプランナが問い合わせを最適化する際のテーブル制約の使用を制御します。constraint_exclusion
に許容される値は、on
(全てのテーブルに対し制約を検査する)、off
(決して制約を検査しない)、およびpartition
(継承された子テーブルおよびUNION ALL
副問い合わせのみ制約を検査する)です。partition
がデフォルトの設定です。伝統的な継承ツリーでしばしば性能向上のために使用されます。
このパラメータが特定のテーブルに対して許される時、プランナはそのテーブルのCHECK
制約で問い合わせ条件を比較し、制約と矛盾する条件のテーブルの走査を省きます。例えば以下のようになります。CREATE TABLE parent(key integer, ...);CREATE TABLE child1000(check (key between 1000 and 1999)) INHERITS(parent);CREATE TABLE child2000(check (key between 2000 and 2999)) INHERITS(parent);...SELECT * FROM parent WHERE key = 2400; 制約排除が有効であると、このSELECTは全くchild1000を走査せず、性能を向上させます。
現在、継承ツリーを使ってテーブルパーティショニングを実装するために使用されるよくある場合のことだけを考慮して、制約排除はデフォルトで有効です。すべてのテーブルに対して有効にするのは、単純な問い合わせにおいて特にはっきりわかる計画作成の余計なオーバーヘッドをもたらし、単純な問い合わせにはメリットがありません。伝統的な継承を使うパーティショニングされたテーブルがない場合、完全に無効にする方が良いでしょう。(パーティショニングされたテーブル用の同等の機能は別のパラメータenable_partition_pruningで制御します。)
パーティショニングを実装するための制約排除の利用についてのより進んだ情報はddl-partitioning-constraint-exclusionを参照ください。
推奨事項 [EN]
On StackOverflow
On pgsql-hackers
- Check each of base restriction clauses for constant-FALSE-or-NULL
- Re: Check each of base restriction clauses for constant-FALSE-or-NULL
- Re: MergeJoin beats HashJoin in the case of multiple hash clauses
- Re: CHECK Constraint Deferrable
- Re: Removing const-false IS NULL quals and redundant IS NOT NULL quals