diff options
Diffstat (limited to 'src/backend/optimizer/path/costsize.c')
-rw-r--r-- | src/backend/optimizer/path/costsize.c | 43 |
1 files changed, 19 insertions, 24 deletions
diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index b8d406f230c..1057ddaa3e5 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -145,7 +145,7 @@ typedef struct QualCost total; } cost_qual_eval_context; -static List *extract_nonindex_conditions(List *qual_clauses, List *indexquals); +static List *extract_nonindex_conditions(List *qual_clauses, List *indexclauses); static MergeScanSelCache *cached_scansel(PlannerInfo *root, RestrictInfo *rinfo, PathKey *pathkey); @@ -517,18 +517,17 @@ cost_index(IndexPath *path, PlannerInfo *root, double loop_count, { path->path.rows = path->path.param_info->ppi_rows; /* qpquals come from the rel's restriction clauses and ppi_clauses */ - qpquals = list_concat( - extract_nonindex_conditions(path->indexinfo->indrestrictinfo, - path->indexquals), + qpquals = list_concat(extract_nonindex_conditions(path->indexinfo->indrestrictinfo, + path->indexclauses), extract_nonindex_conditions(path->path.param_info->ppi_clauses, - path->indexquals)); + path->indexclauses)); } else { path->path.rows = baserel->rows; /* qpquals come from just the rel's restriction clauses */ qpquals = extract_nonindex_conditions(path->indexinfo->indrestrictinfo, - path->indexquals); + path->indexclauses); } if (!enable_indexscan) @@ -753,20 +752,19 @@ cost_index(IndexPath *path, PlannerInfo *root, double loop_count, * * Given a list of quals to be enforced in an indexscan, extract the ones that * will have to be applied as qpquals (ie, the index machinery won't handle - * them). The actual rules for this appear in create_indexscan_plan() in - * createplan.c, but the full rules are fairly expensive and we don't want to - * go to that much effort for index paths that don't get selected for the - * final plan. So we approximate it as quals that don't appear directly in - * indexquals and also are not redundant children of the same EquivalenceClass - * as some indexqual. This method neglects some infrequently-relevant - * considerations, specifically clauses that needn't be checked because they - * are implied by an indexqual. It does not seem worth the cycles to try to - * factor that in at this stage, even though createplan.c will take pains to - * remove such unnecessary clauses from the qpquals list if this path is - * selected for use. + * them). Here we detect only whether a qual clause is directly redundant + * with some indexclause. If the index path is chosen for use, createplan.c + * will try a bit harder to get rid of redundant qual conditions; specifically + * it will see if quals can be proven to be implied by the indexquals. But + * it does not seem worth the cycles to try to factor that in at this stage, + * since we're only trying to estimate qual eval costs. Otherwise this must + * match the logic in create_indexscan_plan(). + * + * qual_clauses, and the result, are lists of RestrictInfos. + * indexclauses is a list of IndexClauses. */ static List * -extract_nonindex_conditions(List *qual_clauses, List *indexquals) +extract_nonindex_conditions(List *qual_clauses, List *indexclauses) { List *result = NIL; ListCell *lc; @@ -777,10 +775,8 @@ extract_nonindex_conditions(List *qual_clauses, List *indexquals) if (rinfo->pseudoconstant) continue; /* we may drop pseudoconstants here */ - if (list_member_ptr(indexquals, rinfo)) - continue; /* simple duplicate */ - if (is_redundant_derived_clause(rinfo, indexquals)) - continue; /* derived from same EquivalenceClass */ + if (is_redundant_with_indexclauses(rinfo, indexclauses)) + continue; /* dup or derived from same EquivalenceClass */ /* ... skip the predicate proof attempt createplan.c will try ... */ result = lappend(result, rinfo); } @@ -4242,8 +4238,7 @@ has_indexed_join_quals(NestPath *joinpath) innerpath->parent->relids, joinrelids)) { - if (!(list_member_ptr(indexclauses, rinfo) || - is_redundant_derived_clause(rinfo, indexclauses))) + if (!is_redundant_with_indexclauses(rinfo, indexclauses)) return false; found_one = true; } |