diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index 373d982c497825a705595b5c63a205bb04caab81..6e59451e558a101d7c3f55378caa2ca823dd2b3a 100644 --- a/src/backend/optimizer/path/allpaths.c +++ b/src/backend/optimizer/path/allpaths.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/path/allpaths.c,v 1.51 1999/07/24 23:21:08 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/path/allpaths.c,v 1.52 1999/07/30 22:34:17 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -59,6 +59,9 @@ make_one_rel(Query *root, List *rels) if (levels_needed <= 0) return NULL; + /* + * Generate access paths for the base rels. + */ set_base_rel_pathlist(root, rels); if (levels_needed <= 1) @@ -73,8 +76,10 @@ make_one_rel(Query *root, List *rels) { /* - * This means that joins or sorts are required. set selectivities - * of clauses that have not been set by an index. + * This means that joins or sorts are required. Set selectivities + * of any clauses not yet set. (I think that this is redundant; + * set_base_rel_pathlist should have set them all already. But + * a scan to check that they are all set doesn't cost much...) */ set_rest_relselec(root, rels); @@ -131,11 +136,15 @@ set_base_rel_pathlist(Query *root, List *rels) set_cheapest(rel, rel->pathlist); - /* - * if there is a qualification of sequential scan the selec. value - * is not set -- so set it explicitly -- Sunita + /* Set the selectivity estimates for any restriction clauses that + * didn't get set as a byproduct of index-path selectivity estimation + * (see create_index_path()). */ set_rest_selec(root, rel->restrictinfo); + + /* Calculate the estimated size (post-restrictions) and tuple width + * for this base rel. This uses the restriction clause selectivities. + */ rel->size = compute_rel_size(rel); rel->width = compute_rel_width(rel); } diff --git a/src/backend/optimizer/util/pathnode.c b/src/backend/optimizer/util/pathnode.c index 0edb1801498f6a992acbb56a6fdf0f76b299a12b..5a548d2a462d202781c0e3071c9ef5aaa14f3e72 100644 --- a/src/backend/optimizer/util/pathnode.c +++ b/src/backend/optimizer/util/pathnode.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/util/pathnode.c,v 1.51 1999/07/30 04:07:25 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/util/pathnode.c,v 1.52 1999/07/30 22:34:19 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -412,14 +412,18 @@ create_index_path(Query *root, /* * Set selectivities of clauses used with index to the selectivity * of this index, subdividing the selectivity equally over each of - * the clauses. + * the clauses. To the extent that index_selectivity() can make a + * better estimate of the joint selectivity of these clauses than + * the product of individual estimates from compute_clause_selec() + * would be, this should give us a more accurate estimate of the + * total selectivity of all the clauses. * - * XXX Can this divide the selectivities in a better way? - * - * XXX In fact, why the heck are we doing this at all? We already - * set the cost for the indexpath, and it's far from obvious that - * the selectivity of the path should have any effect on estimates - * made for other contexts... + * XXX If there is more than one useful index for this rel, and the + * indexes can be used with different but overlapping groups of + * restriction clauses, we may end up with too optimistic an estimate, + * since set_clause_selectivities() will save the minimum of the + * per-clause selectivity estimated with each index. But that should + * be fairly unlikely for typical index usage. */ clausesel = pow(selec, 1.0 / (double) length(restriction_clauses)); set_clause_selectivities(restriction_clauses, clausesel);