diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2007-05-22 01:40:33 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2007-05-22 01:40:33 +0000 |
commit | d7153c5fadca610248775ef9c22ede85f08fd26a (patch) | |
tree | 989a2483def7d8b8805353a8341a4607c54aec29 /src/include/optimizer/paths.h | |
parent | 2415ad983174164ff30ce487c0e6b4b53321b83a (diff) | |
download | postgresql-d7153c5fadca610248775ef9c22ede85f08fd26a.tar.gz postgresql-d7153c5fadca610248775ef9c22ede85f08fd26a.zip |
Fix best_inner_indexscan to return both the cheapest-total-cost and
cheapest-startup-cost innerjoin indexscans, and make joinpath.c consider
both of these (when different) as the inside of a nestloop join. The
original design was based on the assumption that indexscan paths always
have negligible startup cost, and so total cost is the only important
figure of merit; an assumption that's obviously broken by bitmap
indexscans. This oversight could lead to choosing poor plans in cases
where fast-start behavior is more important than total cost, such as
LIMIT and IN queries. 8.1-vintage brain fade exposed by an example from
Chuck D.
Diffstat (limited to 'src/include/optimizer/paths.h')
-rw-r--r-- | src/include/optimizer/paths.h | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/src/include/optimizer/paths.h b/src/include/optimizer/paths.h index c7b8d8c7521..7199a545b29 100644 --- a/src/include/optimizer/paths.h +++ b/src/include/optimizer/paths.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/optimizer/paths.h,v 1.97 2007/04/15 20:09:28 tgl Exp $ + * $PostgreSQL: pgsql/src/include/optimizer/paths.h,v 1.98 2007/05/22 01:40:33 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -45,8 +45,9 @@ extern void create_index_paths(PlannerInfo *root, RelOptInfo *rel); extern List *generate_bitmap_or_paths(PlannerInfo *root, RelOptInfo *rel, List *clauses, List *outer_clauses, RelOptInfo *outer_rel); -extern Path *best_inner_indexscan(PlannerInfo *root, RelOptInfo *rel, - RelOptInfo *outer_rel, JoinType jointype); +extern void best_inner_indexscan(PlannerInfo *root, RelOptInfo *rel, + RelOptInfo *outer_rel, JoinType jointype, + Path **cheapest_startup, Path **cheapest_total); extern List *group_clauses_by_indexkey(IndexOptInfo *index, List *clauses, List *outer_clauses, Relids outer_relids, |