(Sorry David. I initially replied only to you) Ok. I've attached a patch of a proof-of-concept. I have a few questions about tests.
What is typical workflow to add tests for changes to the planner? Also I ran make check and it appears one of the existing tests is failing. What is a typical way for going about discovering why the query plan for a specific query changed? Also, how should I go about changing the old test? Should I replace the old test output with the new test output or modify the old test slightly to get it to produce the same case as before? Thanks, Michael
diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index 051a854..58224e6 100644 *** a/src/backend/optimizer/path/costsize.c --- b/src/backend/optimizer/path/costsize.c *************** *** 163,169 **** static void set_rel_width(PlannerInfo *root, RelOptInfo *rel); static double relation_byte_size(double tuples, int width); static double page_size(double tuples, int width); static double get_parallel_divisor(Path *path); ! /* * clamp_row_est --- 163,172 ---- static double relation_byte_size(double tuples, int width); static double page_size(double tuples, int width); static double get_parallel_divisor(Path *path); ! static double ordered_page_read_cost(double pages_fetched, ! int baserel_pages, ! double spc_seq_page_cost, ! double spc_random_page_cost); /* * clamp_row_est *************** *** 652,660 **** cost_index(IndexPath *path, PlannerInfo *root, double loop_count, if (pages_fetched > 0) { ! min_IO_cost = spc_random_page_cost; ! if (pages_fetched > 1) ! min_IO_cost += (pages_fetched - 1) * spc_seq_page_cost; } else min_IO_cost = 0; --- 655,680 ---- if (pages_fetched > 0) { ! if (index->indpred == NIL) ! { ! min_IO_cost = spc_random_page_cost; ! if (pages_fetched > 1) ! min_IO_cost += (pages_fetched - 1) * spc_seq_page_cost; ! } ! else ! { ! /* ! * For a partial index perfectly correlated with the table ! * ordering, consecutive pages fetched are not guarenteed to ! * be adjacent in the table. Instead use ! * ordered_page_read_cost to estimate the cost of reading ! * pages from the heap. ! */ ! min_IO_cost = ordered_page_read_cost(pages_fetched, ! baserel->pages, ! spc_seq_page_cost, ! spc_seq_page_cost); ! } } else min_IO_cost = 0; *************** *** 934,946 **** cost_bitmap_heap_scan(Path *path, PlannerInfo *root, RelOptInfo *baserel, Cost indexTotalCost; QualCost qpqual_cost; Cost cpu_per_tuple; - Cost cost_per_page; Cost cpu_run_cost; double tuples_fetched; double pages_fetched; double spc_seq_page_cost, spc_random_page_cost; - double T; /* Should only be applied to base relations */ Assert(IsA(baserel, RelOptInfo)); --- 954,964 ----
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers