diff options
| author | Tom Lane <tgl@sss.pgh.pa.us> | 2009-02-15 20:16:21 +0000 |
|---|---|---|
| committer | Tom Lane <tgl@sss.pgh.pa.us> | 2009-02-15 20:16:21 +0000 |
| commit | ce6e31de9c99430256468d059eb226ea7a267376 (patch) | |
| tree | 9aaa52d121cf80e3426405f981c0f46dfd14b68f /src/backend/optimizer/path | |
| parent | 57b5984d241c00bb8362881a14cc566fbb4869e3 (diff) | |
| download | postgresql-ce6e31de9c99430256468d059eb226ea7a267376.tar.gz | |
Teach the planner to treat a partial unique index as proving a variable is
unique for a particular query, if the index predicate is satisfied. This
requires a bit of reordering of operations so that we check the predicates
before doing any selectivity estimates, but shouldn't really cause any
noticeable slowdown. Per a comment from Michal Politowski.
Diffstat (limited to 'src/backend/optimizer/path')
| -rw-r--r-- | src/backend/optimizer/path/allpaths.c | 16 | ||||
| -rw-r--r-- | src/backend/optimizer/path/indxpath.c | 13 | ||||
| -rw-r--r-- | src/backend/optimizer/path/orindxpath.c | 4 |
3 files changed, 23 insertions, 10 deletions
diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index b94b8a5811..4e0d9ca4e5 100644 --- a/src/backend/optimizer/path/allpaths.c +++ b/src/backend/optimizer/path/allpaths.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/path/allpaths.c,v 1.179 2009/01/01 17:23:43 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/path/allpaths.c,v 1.180 2009/02/15 20:16:21 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -225,19 +225,25 @@ set_plain_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte) return; } + /* + * Test any partial indexes of rel for applicability. We must do this + * first since partial unique indexes can affect size estimates. + */ + check_partial_indexes(root, rel); + /* Mark rel with estimated output rows, width, etc */ set_baserel_size_estimates(root, rel); - /* Test any partial indexes of rel for applicability */ - check_partial_indexes(root, rel); - /* * Check to see if we can extract any restriction conditions from join * quals that are OR-of-AND structures. If so, add them to the rel's - * restriction list, and recompute the size estimates. + * restriction list, and redo the above steps. */ if (create_or_index_quals(root, rel)) + { + check_partial_indexes(root, rel); set_baserel_size_estimates(root, rel); + } /* * Generate paths and add them to the rel's pathlist. diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c index b3482b4b5b..6f27a19182 100644 --- a/src/backend/optimizer/path/indxpath.c +++ b/src/backend/optimizer/path/indxpath.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/path/indxpath.c,v 1.235 2009/01/01 17:23:43 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/path/indxpath.c,v 1.236 2009/02/15 20:16:21 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1367,8 +1367,12 @@ match_rowcompare_to_indexcol(IndexOptInfo *index, /* * check_partial_indexes - * Check each partial index of the relation, and mark it predOK or not - * depending on whether the predicate is satisfied for this query. + * Check each partial index of the relation, and mark it predOK if + * the index's predicate is satisfied for this query. + * + * Note: it is possible for this to get re-run after adding more restrictions + * to the rel; so we might be able to prove more indexes OK. We assume that + * adding more restrictions can't make an index not OK. */ void check_partial_indexes(PlannerInfo *root, RelOptInfo *rel) @@ -1383,6 +1387,9 @@ check_partial_indexes(PlannerInfo *root, RelOptInfo *rel) if (index->indpred == NIL) continue; /* ignore non-partial indexes */ + if (index->predOK) + continue; /* don't repeat work if already proven OK */ + index->predOK = predicate_implied_by(index->indpred, restrictinfo_list); } diff --git a/src/backend/optimizer/path/orindxpath.c b/src/backend/optimizer/path/orindxpath.c index 638078e169..2f8a67394e 100644 --- a/src/backend/optimizer/path/orindxpath.c +++ b/src/backend/optimizer/path/orindxpath.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/path/orindxpath.c,v 1.87 2009/02/06 23:43:23 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/path/orindxpath.c,v 1.88 2009/02/15 20:16:21 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -181,6 +181,6 @@ create_or_index_quals(PlannerInfo *root, RelOptInfo *rel) /* It isn't an outer join clause, so no need to adjust outer_selec */ } - /* Tell caller to recompute rel's rows estimate */ + /* Tell caller to recompute partial index status and rowcount estimate */ return true; } |
