(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 ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers