]> granicus.if.org Git - postgresql/blob - src/backend/optimizer/path/costsize.c
In cost_mergejoin, the early-exit effect should not apply to the
[postgresql] / src / backend / optimizer / path / costsize.c
1 /*-------------------------------------------------------------------------
2  *
3  * costsize.c
4  *        Routines to compute (and set) relation sizes and path costs
5  *
6  * Path costs are measured in units of disk accesses: one sequential page
7  * fetch has cost 1.  All else is scaled relative to a page fetch, using
8  * the scaling parameters
9  *
10  *      random_page_cost        Cost of a non-sequential page fetch
11  *      cpu_tuple_cost          Cost of typical CPU time to process a tuple
12  *      cpu_index_tuple_cost  Cost of typical CPU time to process an index tuple
13  *      cpu_operator_cost       Cost of CPU time to process a typical WHERE operator
14  *
15  * We also use a rough estimate "effective_cache_size" of the number of
16  * disk pages in Postgres + OS-level disk cache.  (We can't simply use
17  * NBuffers for this purpose because that would ignore the effects of
18  * the kernel's disk cache.)
19  *
20  * Obviously, taking constants for these values is an oversimplification,
21  * but it's tough enough to get any useful estimates even at this level of
22  * detail.      Note that all of these parameters are user-settable, in case
23  * the default values are drastically off for a particular platform.
24  *
25  * We compute two separate costs for each path:
26  *              total_cost: total estimated cost to fetch all tuples
27  *              startup_cost: cost that is expended before first tuple is fetched
28  * In some scenarios, such as when there is a LIMIT or we are implementing
29  * an EXISTS(...) sub-select, it is not necessary to fetch all tuples of the
30  * path's result.  A caller can estimate the cost of fetching a partial
31  * result by interpolating between startup_cost and total_cost.  In detail:
32  *              actual_cost = startup_cost +
33  *                      (total_cost - startup_cost) * tuples_to_fetch / path->parent->rows;
34  * Note that a base relation's rows count (and, by extension, plan_rows for
35  * plan nodes below the LIMIT node) are set without regard to any LIMIT, so
36  * that this equation works properly.  (Also, these routines guarantee not to
37  * set the rows count to zero, so there will be no zero divide.)  The LIMIT is
38  * applied as a top-level plan node.
39  *
40  * For largely historical reasons, most of the routines in this module use
41  * the passed result Path only to store their startup_cost and total_cost
42  * results into.  All the input data they need is passed as separate
43  * parameters, even though much of it could be extracted from the Path.
44  * An exception is made for the cost_XXXjoin() routines, which expect all
45  * the non-cost fields of the passed XXXPath to be filled in.
46  *
47  *
48  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
49  * Portions Copyright (c) 1994, Regents of the University of California
50  *
51  * IDENTIFICATION
52  *        $PostgreSQL: pgsql/src/backend/optimizer/path/costsize.c,v 1.141 2005/04/04 01:43:12 tgl Exp $
53  *
54  *-------------------------------------------------------------------------
55  */
56
57 #include "postgres.h"
58
59 #include <math.h>
60
61 #include "catalog/pg_statistic.h"
62 #include "executor/nodeHash.h"
63 #include "miscadmin.h"
64 #include "optimizer/clauses.h"
65 #include "optimizer/cost.h"
66 #include "optimizer/pathnode.h"
67 #include "optimizer/plancat.h"
68 #include "parser/parsetree.h"
69 #include "utils/selfuncs.h"
70 #include "utils/lsyscache.h"
71 #include "utils/syscache.h"
72
73
74 #define LOG2(x)  (log(x) / 0.693147180559945)
75 #define LOG6(x)  (log(x) / 1.79175946922805)
76
77 /*
78  * Some Paths return less than the nominal number of rows of their parent
79  * relations; join nodes need to do this to get the correct input count:
80  */
81 #define PATH_ROWS(path) \
82         (IsA(path, UniquePath) ? \
83          ((UniquePath *) (path))->rows : \
84          (path)->parent->rows)
85
86
87 double          effective_cache_size = DEFAULT_EFFECTIVE_CACHE_SIZE;
88 double          random_page_cost = DEFAULT_RANDOM_PAGE_COST;
89 double          cpu_tuple_cost = DEFAULT_CPU_TUPLE_COST;
90 double          cpu_index_tuple_cost = DEFAULT_CPU_INDEX_TUPLE_COST;
91 double          cpu_operator_cost = DEFAULT_CPU_OPERATOR_COST;
92
93 Cost            disable_cost = 100000000.0;
94
95 bool            enable_seqscan = true;
96 bool            enable_indexscan = true;
97 bool            enable_tidscan = true;
98 bool            enable_sort = true;
99 bool            enable_hashagg = true;
100 bool            enable_nestloop = true;
101 bool            enable_mergejoin = true;
102 bool            enable_hashjoin = true;
103
104
105 static bool cost_qual_eval_walker(Node *node, QualCost *total);
106 static Selectivity approx_selectivity(Query *root, List *quals,
107                                    JoinType jointype);
108 static Selectivity join_in_selectivity(JoinPath *path, Query *root);
109 static void set_rel_width(Query *root, RelOptInfo *rel);
110 static double relation_byte_size(double tuples, int width);
111 static double page_size(double tuples, int width);
112
113
114 /*
115  * clamp_row_est
116  *              Force a row-count estimate to a sane value.
117  */
118 double
119 clamp_row_est(double nrows)
120 {
121         /*
122          * Force estimate to be at least one row, to make explain output look
123          * better and to avoid possible divide-by-zero when interpolating
124          * costs.  Make it an integer, too.
125          */
126         if (nrows < 1.0)
127                 nrows = 1.0;
128         else
129                 nrows = ceil(nrows);
130
131         return nrows;
132 }
133
134
135 /*
136  * cost_seqscan
137  *        Determines and returns the cost of scanning a relation sequentially.
138  */
139 void
140 cost_seqscan(Path *path, Query *root,
141                          RelOptInfo *baserel)
142 {
143         Cost            startup_cost = 0;
144         Cost            run_cost = 0;
145         Cost            cpu_per_tuple;
146
147         /* Should only be applied to base relations */
148         Assert(baserel->relid > 0);
149         Assert(baserel->rtekind == RTE_RELATION);
150
151         if (!enable_seqscan)
152                 startup_cost += disable_cost;
153
154         /*
155          * disk costs
156          *
157          * The cost of reading a page sequentially is 1.0, by definition. Note
158          * that the Unix kernel will typically do some amount of read-ahead
159          * optimization, so that this cost is less than the true cost of
160          * reading a page from disk.  We ignore that issue here, but must take
161          * it into account when estimating the cost of non-sequential
162          * accesses!
163          */
164         run_cost += baserel->pages; /* sequential fetches with cost 1.0 */
165
166         /* CPU costs */
167         startup_cost += baserel->baserestrictcost.startup;
168         cpu_per_tuple = cpu_tuple_cost + baserel->baserestrictcost.per_tuple;
169         run_cost += cpu_per_tuple * baserel->tuples;
170
171         path->startup_cost = startup_cost;
172         path->total_cost = startup_cost + run_cost;
173 }
174
175 /*
176  * cost_nonsequential_access
177  *        Estimate the cost of accessing one page at random from a relation
178  *        (or sort temp file) of the given size in pages.
179  *
180  * The simplistic model that the cost is random_page_cost is what we want
181  * to use for large relations; but for small ones that is a serious
182  * overestimate because of the effects of caching.      This routine tries to
183  * account for that.
184  *
185  * Unfortunately we don't have any good way of estimating the effective cache
186  * size we are working with --- we know that Postgres itself has NBuffers
187  * internal buffers, but the size of the kernel's disk cache is uncertain,
188  * and how much of it we get to use is even less certain.  We punt the problem
189  * for now by assuming we are given an effective_cache_size parameter.
190  *
191  * Given a guesstimated cache size, we estimate the actual I/O cost per page
192  * with the entirely ad-hoc equations (writing relsize for
193  * relpages/effective_cache_size):
194  *      if relsize >= 1:
195  *              random_page_cost - (random_page_cost-1)/2 * (1/relsize)
196  *      if relsize < 1:
197  *              1 + ((random_page_cost-1)/2) * relsize ** 2
198  * These give the right asymptotic behavior (=> 1.0 as relpages becomes
199  * small, => random_page_cost as it becomes large) and meet in the middle
200  * with the estimate that the cache is about 50% effective for a relation
201  * of the same size as effective_cache_size.  (XXX this is probably all
202  * wrong, but I haven't been able to find any theory about how effective
203  * a disk cache should be presumed to be.)
204  */
205 static Cost
206 cost_nonsequential_access(double relpages)
207 {
208         double          relsize;
209
210         /* don't crash on bad input data */
211         if (relpages <= 0.0 || effective_cache_size <= 0.0)
212                 return random_page_cost;
213
214         relsize = relpages / effective_cache_size;
215
216         if (relsize >= 1.0)
217                 return random_page_cost - (random_page_cost - 1.0) * 0.5 / relsize;
218         else
219                 return 1.0 + (random_page_cost - 1.0) * 0.5 * relsize * relsize;
220 }
221
222 /*
223  * cost_index
224  *        Determines and returns the cost of scanning a relation using an index.
225  *
226  *        NOTE: an indexscan plan node can actually represent several passes,
227  *        but here we consider the cost of just one pass.
228  *
229  * 'root' is the query root
230  * 'index' is the index to be used
231  * 'indexQuals' is the list of applicable qual clauses (implicit AND semantics)
232  * 'is_injoin' is T if we are considering using the index scan as the inside
233  *              of a nestloop join (hence, some of the indexQuals are join clauses)
234  *
235  * NOTE: 'indexQuals' must contain only clauses usable as index restrictions.
236  * Any additional quals evaluated as qpquals may reduce the number of returned
237  * tuples, but they won't reduce the number of tuples we have to fetch from
238  * the table, so they don't reduce the scan cost.
239  *
240  * NOTE: as of 8.0, indexQuals is a list of RestrictInfo nodes, where formerly
241  * it was a list of bare clause expressions.
242  */
243 void
244 cost_index(Path *path, Query *root,
245                    IndexOptInfo *index,
246                    List *indexQuals,
247                    bool is_injoin)
248 {
249         RelOptInfo *baserel = index->rel;
250         Cost            startup_cost = 0;
251         Cost            run_cost = 0;
252         Cost            indexStartupCost;
253         Cost            indexTotalCost;
254         Selectivity indexSelectivity;
255         double          indexCorrelation,
256                                 csquared;
257         Cost            min_IO_cost,
258                                 max_IO_cost;
259         Cost            cpu_per_tuple;
260         double          tuples_fetched;
261         double          pages_fetched;
262         double          T,
263                                 b;
264
265         /* Should only be applied to base relations */
266         Assert(IsA(baserel, RelOptInfo) &&
267                    IsA(index, IndexOptInfo));
268         Assert(baserel->relid > 0);
269         Assert(baserel->rtekind == RTE_RELATION);
270
271         if (!enable_indexscan)
272                 startup_cost += disable_cost;
273
274         /*
275          * Call index-access-method-specific code to estimate the processing
276          * cost for scanning the index, as well as the selectivity of the
277          * index (ie, the fraction of main-table tuples we will have to
278          * retrieve) and its correlation to the main-table tuple order.
279          */
280         OidFunctionCall7(index->amcostestimate,
281                                          PointerGetDatum(root),
282                                          PointerGetDatum(index),
283                                          PointerGetDatum(indexQuals),
284                                          PointerGetDatum(&indexStartupCost),
285                                          PointerGetDatum(&indexTotalCost),
286                                          PointerGetDatum(&indexSelectivity),
287                                          PointerGetDatum(&indexCorrelation));
288
289         /* all costs for touching index itself included here */
290         startup_cost += indexStartupCost;
291         run_cost += indexTotalCost - indexStartupCost;
292
293         /*----------
294          * Estimate number of main-table tuples and pages fetched.
295          *
296          * When the index ordering is uncorrelated with the table ordering,
297          * we use an approximation proposed by Mackert and Lohman, "Index Scans
298          * Using a Finite LRU Buffer: A Validated I/O Model", ACM Transactions
299          * on Database Systems, Vol. 14, No. 3, September 1989, Pages 401-424.
300          * The Mackert and Lohman approximation is that the number of pages
301          * fetched is
302          *      PF =
303          *              min(2TNs/(2T+Ns), T)                    when T <= b
304          *              2TNs/(2T+Ns)                                    when T > b and Ns <= 2Tb/(2T-b)
305          *              b + (Ns - 2Tb/(2T-b))*(T-b)/T   when T > b and Ns > 2Tb/(2T-b)
306          * where
307          *              T = # pages in table
308          *              N = # tuples in table
309          *              s = selectivity = fraction of table to be scanned
310          *              b = # buffer pages available (we include kernel space here)
311          *
312          * When the index ordering is exactly correlated with the table ordering
313          * (just after a CLUSTER, for example), the number of pages fetched should
314          * be just sT.  What's more, these will be sequential fetches, not the
315          * random fetches that occur in the uncorrelated case.  So, depending on
316          * the extent of correlation, we should estimate the actual I/O cost
317          * somewhere between s * T * 1.0 and PF * random_cost.  We currently
318          * interpolate linearly between these two endpoints based on the
319          * correlation squared (XXX is that appropriate?).
320          *
321          * In any case the number of tuples fetched is Ns.
322          *----------
323          */
324
325         tuples_fetched = clamp_row_est(indexSelectivity * baserel->tuples);
326
327         /* This part is the Mackert and Lohman formula */
328
329         T = (baserel->pages > 1) ? (double) baserel->pages : 1.0;
330         b = (effective_cache_size > 1) ? effective_cache_size : 1.0;
331
332         if (T <= b)
333         {
334                 pages_fetched =
335                         (2.0 * T * tuples_fetched) / (2.0 * T + tuples_fetched);
336                 if (pages_fetched > T)
337                         pages_fetched = T;
338         }
339         else
340         {
341                 double          lim;
342
343                 lim = (2.0 * T * b) / (2.0 * T - b);
344                 if (tuples_fetched <= lim)
345                 {
346                         pages_fetched =
347                                 (2.0 * T * tuples_fetched) / (2.0 * T + tuples_fetched);
348                 }
349                 else
350                 {
351                         pages_fetched =
352                                 b + (tuples_fetched - lim) * (T - b) / T;
353                 }
354         }
355
356         /*
357          * min_IO_cost corresponds to the perfectly correlated case
358          * (csquared=1), max_IO_cost to the perfectly uncorrelated case
359          * (csquared=0).  Note that we just charge random_page_cost per page
360          * in the uncorrelated case, rather than using
361          * cost_nonsequential_access, since we've already accounted for
362          * caching effects by using the Mackert model.
363          */
364         min_IO_cost = ceil(indexSelectivity * T);
365         max_IO_cost = pages_fetched * random_page_cost;
366
367         /*
368          * Now interpolate based on estimated index order correlation to get
369          * total disk I/O cost for main table accesses.
370          */
371         csquared = indexCorrelation * indexCorrelation;
372
373         run_cost += max_IO_cost + csquared * (min_IO_cost - max_IO_cost);
374
375         /*
376          * Estimate CPU costs per tuple.
377          *
378          * Normally the indexquals will be removed from the list of restriction
379          * clauses that we have to evaluate as qpquals, so we should subtract
380          * their costs from baserestrictcost.  But if we are doing a join then
381          * some of the indexquals are join clauses and shouldn't be
382          * subtracted. Rather than work out exactly how much to subtract, we
383          * don't subtract anything.
384          */
385         startup_cost += baserel->baserestrictcost.startup;
386         cpu_per_tuple = cpu_tuple_cost + baserel->baserestrictcost.per_tuple;
387
388         if (!is_injoin)
389         {
390                 QualCost        index_qual_cost;
391
392                 cost_qual_eval(&index_qual_cost, indexQuals);
393                 /* any startup cost still has to be paid ... */
394                 cpu_per_tuple -= index_qual_cost.per_tuple;
395         }
396
397         run_cost += cpu_per_tuple * tuples_fetched;
398
399         path->startup_cost = startup_cost;
400         path->total_cost = startup_cost + run_cost;
401 }
402
403 /*
404  * cost_tidscan
405  *        Determines and returns the cost of scanning a relation using TIDs.
406  */
407 void
408 cost_tidscan(Path *path, Query *root,
409                          RelOptInfo *baserel, List *tideval)
410 {
411         Cost            startup_cost = 0;
412         Cost            run_cost = 0;
413         Cost            cpu_per_tuple;
414         int                     ntuples = list_length(tideval);
415
416         /* Should only be applied to base relations */
417         Assert(baserel->relid > 0);
418         Assert(baserel->rtekind == RTE_RELATION);
419
420         if (!enable_tidscan)
421                 startup_cost += disable_cost;
422
423         /* disk costs --- assume each tuple on a different page */
424         run_cost += random_page_cost * ntuples;
425
426         /* CPU costs */
427         startup_cost += baserel->baserestrictcost.startup;
428         cpu_per_tuple = cpu_tuple_cost + baserel->baserestrictcost.per_tuple;
429         run_cost += cpu_per_tuple * ntuples;
430
431         path->startup_cost = startup_cost;
432         path->total_cost = startup_cost + run_cost;
433 }
434
435 /*
436  * cost_subqueryscan
437  *        Determines and returns the cost of scanning a subquery RTE.
438  */
439 void
440 cost_subqueryscan(Path *path, RelOptInfo *baserel)
441 {
442         Cost            startup_cost;
443         Cost            run_cost;
444         Cost            cpu_per_tuple;
445
446         /* Should only be applied to base relations that are subqueries */
447         Assert(baserel->relid > 0);
448         Assert(baserel->rtekind == RTE_SUBQUERY);
449
450         /*
451          * Cost of path is cost of evaluating the subplan, plus cost of
452          * evaluating any restriction clauses that will be attached to the
453          * SubqueryScan node, plus cpu_tuple_cost to account for selection and
454          * projection overhead.
455          */
456         path->startup_cost = baserel->subplan->startup_cost;
457         path->total_cost = baserel->subplan->total_cost;
458
459         startup_cost = baserel->baserestrictcost.startup;
460         cpu_per_tuple = cpu_tuple_cost + baserel->baserestrictcost.per_tuple;
461         run_cost = cpu_per_tuple * baserel->tuples;
462
463         path->startup_cost += startup_cost;
464         path->total_cost += startup_cost + run_cost;
465 }
466
467 /*
468  * cost_functionscan
469  *        Determines and returns the cost of scanning a function RTE.
470  */
471 void
472 cost_functionscan(Path *path, Query *root, RelOptInfo *baserel)
473 {
474         Cost            startup_cost = 0;
475         Cost            run_cost = 0;
476         Cost            cpu_per_tuple;
477
478         /* Should only be applied to base relations that are functions */
479         Assert(baserel->relid > 0);
480         Assert(baserel->rtekind == RTE_FUNCTION);
481
482         /*
483          * For now, estimate function's cost at one operator eval per function
484          * call.  Someday we should revive the function cost estimate columns
485          * in pg_proc...
486          */
487         cpu_per_tuple = cpu_operator_cost;
488
489         /* Add scanning CPU costs */
490         startup_cost += baserel->baserestrictcost.startup;
491         cpu_per_tuple += cpu_tuple_cost + baserel->baserestrictcost.per_tuple;
492         run_cost += cpu_per_tuple * baserel->tuples;
493
494         path->startup_cost = startup_cost;
495         path->total_cost = startup_cost + run_cost;
496 }
497
498 /*
499  * cost_sort
500  *        Determines and returns the cost of sorting a relation, including
501  *        the cost of reading the input data.
502  *
503  * If the total volume of data to sort is less than work_mem, we will do
504  * an in-memory sort, which requires no I/O and about t*log2(t) tuple
505  * comparisons for t tuples.
506  *
507  * If the total volume exceeds work_mem, we switch to a tape-style merge
508  * algorithm.  There will still be about t*log2(t) tuple comparisons in
509  * total, but we will also need to write and read each tuple once per
510  * merge pass.  We expect about ceil(log6(r)) merge passes where r is the
511  * number of initial runs formed (log6 because tuplesort.c uses six-tape
512  * merging).  Since the average initial run should be about twice work_mem,
513  * we have
514  *              disk traffic = 2 * relsize * ceil(log6(p / (2*work_mem)))
515  *              cpu = comparison_cost * t * log2(t)
516  *
517  * The disk traffic is assumed to be half sequential and half random
518  * accesses (XXX can't we refine that guess?)
519  *
520  * We charge two operator evals per tuple comparison, which should be in
521  * the right ballpark in most cases.
522  *
523  * 'pathkeys' is a list of sort keys
524  * 'input_cost' is the total cost for reading the input data
525  * 'tuples' is the number of tuples in the relation
526  * 'width' is the average tuple width in bytes
527  *
528  * NOTE: some callers currently pass NIL for pathkeys because they
529  * can't conveniently supply the sort keys.  Since this routine doesn't
530  * currently do anything with pathkeys anyway, that doesn't matter...
531  * but if it ever does, it should react gracefully to lack of key data.
532  * (Actually, the thing we'd most likely be interested in is just the number
533  * of sort keys, which all callers *could* supply.)
534  */
535 void
536 cost_sort(Path *path, Query *root,
537                   List *pathkeys, Cost input_cost, double tuples, int width)
538 {
539         Cost            startup_cost = input_cost;
540         Cost            run_cost = 0;
541         double          nbytes = relation_byte_size(tuples, width);
542         long            work_mem_bytes = work_mem * 1024L;
543
544         if (!enable_sort)
545                 startup_cost += disable_cost;
546
547         /*
548          * We want to be sure the cost of a sort is never estimated as zero,
549          * even if passed-in tuple count is zero.  Besides, mustn't do
550          * log(0)...
551          */
552         if (tuples < 2.0)
553                 tuples = 2.0;
554
555         /*
556          * CPU costs
557          *
558          * Assume about two operator evals per tuple comparison and N log2 N
559          * comparisons
560          */
561         startup_cost += 2.0 * cpu_operator_cost * tuples * LOG2(tuples);
562
563         /* disk costs */
564         if (nbytes > work_mem_bytes)
565         {
566                 double          npages = ceil(nbytes / BLCKSZ);
567                 double          nruns = (nbytes / work_mem_bytes) * 0.5;
568                 double          log_runs = ceil(LOG6(nruns));
569                 double          npageaccesses;
570
571                 if (log_runs < 1.0)
572                         log_runs = 1.0;
573                 npageaccesses = 2.0 * npages * log_runs;
574                 /* Assume half are sequential (cost 1), half are not */
575                 startup_cost += npageaccesses *
576                         (1.0 + cost_nonsequential_access(npages)) * 0.5;
577         }
578
579         /*
580          * Also charge a small amount (arbitrarily set equal to operator cost)
581          * per extracted tuple.
582          */
583         run_cost += cpu_operator_cost * tuples;
584
585         path->startup_cost = startup_cost;
586         path->total_cost = startup_cost + run_cost;
587 }
588
589 /*
590  * cost_material
591  *        Determines and returns the cost of materializing a relation, including
592  *        the cost of reading the input data.
593  *
594  * If the total volume of data to materialize exceeds work_mem, we will need
595  * to write it to disk, so the cost is much higher in that case.
596  */
597 void
598 cost_material(Path *path,
599                           Cost input_cost, double tuples, int width)
600 {
601         Cost            startup_cost = input_cost;
602         Cost            run_cost = 0;
603         double          nbytes = relation_byte_size(tuples, width);
604         long            work_mem_bytes = work_mem * 1024L;
605
606         /* disk costs */
607         if (nbytes > work_mem_bytes)
608         {
609                 double          npages = ceil(nbytes / BLCKSZ);
610
611                 /* We'll write during startup and read during retrieval */
612                 startup_cost += npages;
613                 run_cost += npages;
614         }
615
616         /*
617          * Charge a very small amount per inserted tuple, to reflect bookkeeping
618          * costs.  We use cpu_tuple_cost/10 for this.  This is needed to break
619          * the tie that would otherwise exist between nestloop with A outer,
620          * materialized B inner and nestloop with B outer, materialized A inner.
621          * The extra cost ensures we'll prefer materializing the smaller rel.
622          */
623         startup_cost += cpu_tuple_cost * 0.1 * tuples;
624
625         /*
626          * Also charge a small amount per extracted tuple.      We use
627          * cpu_tuple_cost so that it doesn't appear worthwhile to materialize
628          * a bare seqscan.
629          */
630         run_cost += cpu_tuple_cost * tuples;
631
632         path->startup_cost = startup_cost;
633         path->total_cost = startup_cost + run_cost;
634 }
635
636 /*
637  * cost_agg
638  *              Determines and returns the cost of performing an Agg plan node,
639  *              including the cost of its input.
640  *
641  * Note: when aggstrategy == AGG_SORTED, caller must ensure that input costs
642  * are for appropriately-sorted input.
643  */
644 void
645 cost_agg(Path *path, Query *root,
646                  AggStrategy aggstrategy, int numAggs,
647                  int numGroupCols, double numGroups,
648                  Cost input_startup_cost, Cost input_total_cost,
649                  double input_tuples)
650 {
651         Cost            startup_cost;
652         Cost            total_cost;
653
654         /*
655          * We charge one cpu_operator_cost per aggregate function per input
656          * tuple, and another one per output tuple (corresponding to transfn
657          * and finalfn calls respectively).  If we are grouping, we charge an
658          * additional cpu_operator_cost per grouping column per input tuple
659          * for grouping comparisons.
660          *
661          * We will produce a single output tuple if not grouping, and a tuple per
662          * group otherwise.
663          *
664          * Note: in this cost model, AGG_SORTED and AGG_HASHED have exactly the
665          * same total CPU cost, but AGG_SORTED has lower startup cost.  If the
666          * input path is already sorted appropriately, AGG_SORTED should be
667          * preferred (since it has no risk of memory overflow).  This will
668          * happen as long as the computed total costs are indeed exactly equal
669          * --- but if there's roundoff error we might do the wrong thing.  So
670          * be sure that the computations below form the same intermediate
671          * values in the same order.
672          */
673         if (aggstrategy == AGG_PLAIN)
674         {
675                 startup_cost = input_total_cost;
676                 startup_cost += cpu_operator_cost * (input_tuples + 1) * numAggs;
677                 /* we aren't grouping */
678                 total_cost = startup_cost;
679         }
680         else if (aggstrategy == AGG_SORTED)
681         {
682                 /* Here we are able to deliver output on-the-fly */
683                 startup_cost = input_startup_cost;
684                 total_cost = input_total_cost;
685                 /* calcs phrased this way to match HASHED case, see note above */
686                 total_cost += cpu_operator_cost * input_tuples * numGroupCols;
687                 total_cost += cpu_operator_cost * input_tuples * numAggs;
688                 total_cost += cpu_operator_cost * numGroups * numAggs;
689         }
690         else
691         {
692                 /* must be AGG_HASHED */
693                 startup_cost = input_total_cost;
694                 startup_cost += cpu_operator_cost * input_tuples * numGroupCols;
695                 startup_cost += cpu_operator_cost * input_tuples * numAggs;
696                 total_cost = startup_cost;
697                 total_cost += cpu_operator_cost * numGroups * numAggs;
698         }
699
700         path->startup_cost = startup_cost;
701         path->total_cost = total_cost;
702 }
703
704 /*
705  * cost_group
706  *              Determines and returns the cost of performing a Group plan node,
707  *              including the cost of its input.
708  *
709  * Note: caller must ensure that input costs are for appropriately-sorted
710  * input.
711  */
712 void
713 cost_group(Path *path, Query *root,
714                    int numGroupCols, double numGroups,
715                    Cost input_startup_cost, Cost input_total_cost,
716                    double input_tuples)
717 {
718         Cost            startup_cost;
719         Cost            total_cost;
720
721         startup_cost = input_startup_cost;
722         total_cost = input_total_cost;
723
724         /*
725          * Charge one cpu_operator_cost per comparison per input tuple. We
726          * assume all columns get compared at most of the tuples.
727          */
728         total_cost += cpu_operator_cost * input_tuples * numGroupCols;
729
730         path->startup_cost = startup_cost;
731         path->total_cost = total_cost;
732 }
733
734 /*
735  * cost_nestloop
736  *        Determines and returns the cost of joining two relations using the
737  *        nested loop algorithm.
738  *
739  * 'path' is already filled in except for the cost fields
740  */
741 void
742 cost_nestloop(NestPath *path, Query *root)
743 {
744         Path       *outer_path = path->outerjoinpath;
745         Path       *inner_path = path->innerjoinpath;
746         Cost            startup_cost = 0;
747         Cost            run_cost = 0;
748         Cost            cpu_per_tuple;
749         QualCost        restrict_qual_cost;
750         double          outer_path_rows = PATH_ROWS(outer_path);
751         double          inner_path_rows = PATH_ROWS(inner_path);
752         double          ntuples;
753         Selectivity joininfactor;
754
755         /*
756          * If inner path is an indexscan, be sure to use its estimated output
757          * row count, which may be lower than the restriction-clause-only row
758          * count of its parent.  (We don't include this case in the PATH_ROWS
759          * macro because it applies *only* to a nestloop's inner relation.)
760          */
761         if (IsA(inner_path, IndexPath))
762                 inner_path_rows = ((IndexPath *) inner_path)->rows;
763
764         if (!enable_nestloop)
765                 startup_cost += disable_cost;
766
767         /*
768          * If we're doing JOIN_IN then we will stop scanning inner tuples for
769          * an outer tuple as soon as we have one match.  Account for the
770          * effects of this by scaling down the cost estimates in proportion to
771          * the JOIN_IN selectivity.  (This assumes that all the quals attached
772          * to the join are IN quals, which should be true.)
773          */
774         joininfactor = join_in_selectivity(path, root);
775
776         /* cost of source data */
777
778         /*
779          * NOTE: clearly, we must pay both outer and inner paths' startup_cost
780          * before we can start returning tuples, so the join's startup cost is
781          * their sum.  What's not so clear is whether the inner path's
782          * startup_cost must be paid again on each rescan of the inner path.
783          * This is not true if the inner path is materialized or is a
784          * hashjoin, but probably is true otherwise.
785          */
786         startup_cost += outer_path->startup_cost + inner_path->startup_cost;
787         run_cost += outer_path->total_cost - outer_path->startup_cost;
788         if (IsA(inner_path, MaterialPath) ||
789                 IsA(inner_path, HashPath))
790         {
791                 /* charge only run cost for each iteration of inner path */
792         }
793         else
794         {
795                 /*
796                  * charge startup cost for each iteration of inner path, except we
797                  * already charged the first startup_cost in our own startup
798                  */
799                 run_cost += (outer_path_rows - 1) * inner_path->startup_cost;
800         }
801         run_cost += outer_path_rows *
802                 (inner_path->total_cost - inner_path->startup_cost) * joininfactor;
803
804         /*
805          * Compute number of tuples processed (not number emitted!)
806          */
807         ntuples = outer_path_rows * inner_path_rows * joininfactor;
808
809         /* CPU costs */
810         cost_qual_eval(&restrict_qual_cost, path->joinrestrictinfo);
811         startup_cost += restrict_qual_cost.startup;
812         cpu_per_tuple = cpu_tuple_cost + restrict_qual_cost.per_tuple;
813         run_cost += cpu_per_tuple * ntuples;
814
815         path->path.startup_cost = startup_cost;
816         path->path.total_cost = startup_cost + run_cost;
817 }
818
819 /*
820  * cost_mergejoin
821  *        Determines and returns the cost of joining two relations using the
822  *        merge join algorithm.
823  *
824  * 'path' is already filled in except for the cost fields
825  *
826  * Notes: path's mergeclauses should be a subset of the joinrestrictinfo list;
827  * outersortkeys and innersortkeys are lists of the keys to be used
828  * to sort the outer and inner relations, or NIL if no explicit
829  * sort is needed because the source path is already ordered.
830  */
831 void
832 cost_mergejoin(MergePath *path, Query *root)
833 {
834         Path       *outer_path = path->jpath.outerjoinpath;
835         Path       *inner_path = path->jpath.innerjoinpath;
836         List       *mergeclauses = path->path_mergeclauses;
837         List       *outersortkeys = path->outersortkeys;
838         List       *innersortkeys = path->innersortkeys;
839         Cost            startup_cost = 0;
840         Cost            run_cost = 0;
841         Cost            cpu_per_tuple;
842         Selectivity merge_selec;
843         QualCost        merge_qual_cost;
844         QualCost        qp_qual_cost;
845         RestrictInfo *firstclause;
846         double          outer_path_rows = PATH_ROWS(outer_path);
847         double          inner_path_rows = PATH_ROWS(inner_path);
848         double          outer_rows,
849                                 inner_rows;
850         double          mergejointuples,
851                                 rescannedtuples;
852         double          rescanratio;
853         Selectivity outerscansel,
854                                 innerscansel;
855         Selectivity joininfactor;
856         Path            sort_path;              /* dummy for result of cost_sort */
857
858         if (!enable_mergejoin)
859                 startup_cost += disable_cost;
860
861         /*
862          * Compute cost and selectivity of the mergequals and qpquals (other
863          * restriction clauses) separately.  We use approx_selectivity here
864          * for speed --- in most cases, any errors won't affect the result
865          * much.
866          *
867          * Note: it's probably bogus to use the normal selectivity calculation
868          * here when either the outer or inner path is a UniquePath.
869          */
870         merge_selec = approx_selectivity(root, mergeclauses,
871                                                                          path->jpath.jointype);
872         cost_qual_eval(&merge_qual_cost, mergeclauses);
873         cost_qual_eval(&qp_qual_cost, path->jpath.joinrestrictinfo);
874         qp_qual_cost.startup -= merge_qual_cost.startup;
875         qp_qual_cost.per_tuple -= merge_qual_cost.per_tuple;
876
877         /* approx # tuples passing the merge quals */
878         mergejointuples = clamp_row_est(merge_selec * outer_path_rows * inner_path_rows);
879
880         /*
881          * When there are equal merge keys in the outer relation, the
882          * mergejoin must rescan any matching tuples in the inner relation.
883          * This means re-fetching inner tuples.  Our cost model for this is
884          * that a re-fetch costs the same as an original fetch, which is
885          * probably an overestimate; but on the other hand we ignore the
886          * bookkeeping costs of mark/restore. Not clear if it's worth
887          * developing a more refined model.
888          *
889          * The number of re-fetches can be estimated approximately as size of
890          * merge join output minus size of inner relation.      Assume that the
891          * distinct key values are 1, 2, ..., and denote the number of values
892          * of each key in the outer relation as m1, m2, ...; in the inner
893          * relation, n1, n2, ...  Then we have
894          *
895          * size of join = m1 * n1 + m2 * n2 + ...
896          *
897          * number of rescanned tuples = (m1 - 1) * n1 + (m2 - 1) * n2 + ... = m1 *
898          * n1 + m2 * n2 + ... - (n1 + n2 + ...) = size of join - size of inner
899          * relation
900          *
901          * This equation works correctly for outer tuples having no inner match
902          * (nk = 0), but not for inner tuples having no outer match (mk = 0);
903          * we are effectively subtracting those from the number of rescanned
904          * tuples, when we should not.  Can we do better without expensive
905          * selectivity computations?
906          */
907         if (IsA(outer_path, UniquePath))
908                 rescannedtuples = 0;
909         else
910         {
911                 rescannedtuples = mergejointuples - inner_path_rows;
912                 /* Must clamp because of possible underestimate */
913                 if (rescannedtuples < 0)
914                         rescannedtuples = 0;
915         }
916         /* We'll inflate inner run cost this much to account for rescanning */
917         rescanratio = 1.0 + (rescannedtuples / inner_path_rows);
918
919         /*
920          * A merge join will stop as soon as it exhausts either input stream
921          * (unless it's an outer join, in which case the outer side has to be
922          * scanned all the way anyway).  Estimate fraction of the left and right
923          * inputs that will actually need to be scanned. We use only the first
924          * (most significant) merge clause for this purpose.
925          *
926          * Since this calculation is somewhat expensive, and will be the same for
927          * all mergejoin paths associated with the merge clause, we cache the
928          * results in the RestrictInfo node.
929          */
930         if (mergeclauses && path->jpath.jointype != JOIN_FULL)
931         {
932                 firstclause = (RestrictInfo *) linitial(mergeclauses);
933                 if (firstclause->left_mergescansel < 0) /* not computed yet? */
934                         mergejoinscansel(root, (Node *) firstclause->clause,
935                                                          &firstclause->left_mergescansel,
936                                                          &firstclause->right_mergescansel);
937
938                 if (bms_is_subset(firstclause->left_relids, outer_path->parent->relids))
939                 {
940                         /* left side of clause is outer */
941                         outerscansel = firstclause->left_mergescansel;
942                         innerscansel = firstclause->right_mergescansel;
943                 }
944                 else
945                 {
946                         /* left side of clause is inner */
947                         outerscansel = firstclause->right_mergescansel;
948                         innerscansel = firstclause->left_mergescansel;
949                 }
950                 if (path->jpath.jointype == JOIN_LEFT)
951                         outerscansel = 1.0;
952                 else if (path->jpath.jointype == JOIN_RIGHT)
953                         innerscansel = 1.0;
954         }
955         else
956         {
957                 /* cope with clauseless or full mergejoin */
958                 outerscansel = innerscansel = 1.0;
959         }
960
961         /* convert selectivity to row count; must scan at least one row */
962         outer_rows = clamp_row_est(outer_path_rows * outerscansel);
963         inner_rows = clamp_row_est(inner_path_rows * innerscansel);
964
965         /*
966          * Readjust scan selectivities to account for above rounding.  This is
967          * normally an insignificant effect, but when there are only a few
968          * rows in the inputs, failing to do this makes for a large percentage
969          * error.
970          */
971         outerscansel = outer_rows / outer_path_rows;
972         innerscansel = inner_rows / inner_path_rows;
973
974         /* cost of source data */
975
976         if (outersortkeys)                      /* do we need to sort outer? */
977         {
978                 cost_sort(&sort_path,
979                                   root,
980                                   outersortkeys,
981                                   outer_path->total_cost,
982                                   outer_path_rows,
983                                   outer_path->parent->width);
984                 startup_cost += sort_path.startup_cost;
985                 run_cost += (sort_path.total_cost - sort_path.startup_cost)
986                         * outerscansel;
987         }
988         else
989         {
990                 startup_cost += outer_path->startup_cost;
991                 run_cost += (outer_path->total_cost - outer_path->startup_cost)
992                         * outerscansel;
993         }
994
995         if (innersortkeys)                      /* do we need to sort inner? */
996         {
997                 cost_sort(&sort_path,
998                                   root,
999                                   innersortkeys,
1000                                   inner_path->total_cost,
1001                                   inner_path_rows,
1002                                   inner_path->parent->width);
1003                 startup_cost += sort_path.startup_cost;
1004                 run_cost += (sort_path.total_cost - sort_path.startup_cost)
1005                         * innerscansel * rescanratio;
1006         }
1007         else
1008         {
1009                 startup_cost += inner_path->startup_cost;
1010                 run_cost += (inner_path->total_cost - inner_path->startup_cost)
1011                         * innerscansel * rescanratio;
1012         }
1013
1014         /* CPU costs */
1015
1016         /*
1017          * If we're doing JOIN_IN then we will stop outputting inner tuples
1018          * for an outer tuple as soon as we have one match.  Account for the
1019          * effects of this by scaling down the cost estimates in proportion to
1020          * the expected output size.  (This assumes that all the quals
1021          * attached to the join are IN quals, which should be true.)
1022          */
1023         joininfactor = join_in_selectivity(&path->jpath, root);
1024
1025         /*
1026          * The number of tuple comparisons needed is approximately number of
1027          * outer rows plus number of inner rows plus number of rescanned
1028          * tuples (can we refine this?).  At each one, we need to evaluate the
1029          * mergejoin quals.  NOTE: JOIN_IN mode does not save any work here,
1030          * so do NOT include joininfactor.
1031          */
1032         startup_cost += merge_qual_cost.startup;
1033         run_cost += merge_qual_cost.per_tuple *
1034                 (outer_rows + inner_rows * rescanratio);
1035
1036         /*
1037          * For each tuple that gets through the mergejoin proper, we charge
1038          * cpu_tuple_cost plus the cost of evaluating additional restriction
1039          * clauses that are to be applied at the join.  (This is pessimistic
1040          * since not all of the quals may get evaluated at each tuple.)  This
1041          * work is skipped in JOIN_IN mode, so apply the factor.
1042          */
1043         startup_cost += qp_qual_cost.startup;
1044         cpu_per_tuple = cpu_tuple_cost + qp_qual_cost.per_tuple;
1045         run_cost += cpu_per_tuple * mergejointuples * joininfactor;
1046
1047         path->jpath.path.startup_cost = startup_cost;
1048         path->jpath.path.total_cost = startup_cost + run_cost;
1049 }
1050
1051 /*
1052  * cost_hashjoin
1053  *        Determines and returns the cost of joining two relations using the
1054  *        hash join algorithm.
1055  *
1056  * 'path' is already filled in except for the cost fields
1057  *
1058  * Note: path's hashclauses should be a subset of the joinrestrictinfo list
1059  */
1060 void
1061 cost_hashjoin(HashPath *path, Query *root)
1062 {
1063         Path       *outer_path = path->jpath.outerjoinpath;
1064         Path       *inner_path = path->jpath.innerjoinpath;
1065         List       *hashclauses = path->path_hashclauses;
1066         Cost            startup_cost = 0;
1067         Cost            run_cost = 0;
1068         Cost            cpu_per_tuple;
1069         Selectivity hash_selec;
1070         QualCost        hash_qual_cost;
1071         QualCost        qp_qual_cost;
1072         double          hashjointuples;
1073         double          outer_path_rows = PATH_ROWS(outer_path);
1074         double          inner_path_rows = PATH_ROWS(inner_path);
1075         double          outerbytes = relation_byte_size(outer_path_rows,
1076                                                                                           outer_path->parent->width);
1077         double          innerbytes = relation_byte_size(inner_path_rows,
1078                                                                                           inner_path->parent->width);
1079         int                     num_hashclauses = list_length(hashclauses);
1080         int                     numbuckets;
1081         int                     numbatches;
1082         double          virtualbuckets;
1083         Selectivity innerbucketsize;
1084         Selectivity joininfactor;
1085         ListCell   *hcl;
1086
1087         if (!enable_hashjoin)
1088                 startup_cost += disable_cost;
1089
1090         /*
1091          * Compute cost and selectivity of the hashquals and qpquals (other
1092          * restriction clauses) separately.  We use approx_selectivity here
1093          * for speed --- in most cases, any errors won't affect the result
1094          * much.
1095          *
1096          * Note: it's probably bogus to use the normal selectivity calculation
1097          * here when either the outer or inner path is a UniquePath.
1098          */
1099         hash_selec = approx_selectivity(root, hashclauses,
1100                                                                         path->jpath.jointype);
1101         cost_qual_eval(&hash_qual_cost, hashclauses);
1102         cost_qual_eval(&qp_qual_cost, path->jpath.joinrestrictinfo);
1103         qp_qual_cost.startup -= hash_qual_cost.startup;
1104         qp_qual_cost.per_tuple -= hash_qual_cost.per_tuple;
1105
1106         /* approx # tuples passing the hash quals */
1107         hashjointuples = clamp_row_est(hash_selec * outer_path_rows * inner_path_rows);
1108
1109         /* cost of source data */
1110         startup_cost += outer_path->startup_cost;
1111         run_cost += outer_path->total_cost - outer_path->startup_cost;
1112         startup_cost += inner_path->total_cost;
1113
1114         /*
1115          * Cost of computing hash function: must do it once per input tuple.
1116          * We charge one cpu_operator_cost for each column's hash function.
1117          *
1118          * XXX when a hashclause is more complex than a single operator, we
1119          * really should charge the extra eval costs of the left or right
1120          * side, as appropriate, here.  This seems more work than it's worth
1121          * at the moment.
1122          */
1123         startup_cost += cpu_operator_cost * num_hashclauses * inner_path_rows;
1124         run_cost += cpu_operator_cost * num_hashclauses * outer_path_rows;
1125
1126         /* Get hash table size that executor would use for inner relation */
1127         ExecChooseHashTableSize(inner_path_rows,
1128                                                         inner_path->parent->width,
1129                                                         &numbuckets,
1130                                                         &numbatches);
1131         virtualbuckets = (double) numbuckets * (double) numbatches;
1132
1133         /*
1134          * Determine bucketsize fraction for inner relation.  We use the
1135          * smallest bucketsize estimated for any individual hashclause; this
1136          * is undoubtedly conservative.
1137          *
1138          * BUT: if inner relation has been unique-ified, we can assume it's good
1139          * for hashing.  This is important both because it's the right answer,
1140          * and because we avoid contaminating the cache with a value that's
1141          * wrong for non-unique-ified paths.
1142          */
1143         if (IsA(inner_path, UniquePath))
1144                 innerbucketsize = 1.0 / virtualbuckets;
1145         else
1146         {
1147                 innerbucketsize = 1.0;
1148                 foreach(hcl, hashclauses)
1149                 {
1150                         RestrictInfo *restrictinfo = (RestrictInfo *) lfirst(hcl);
1151                         Selectivity thisbucketsize;
1152
1153                         Assert(IsA(restrictinfo, RestrictInfo));
1154
1155                         /*
1156                          * First we have to figure out which side of the hashjoin
1157                          * clause is the inner side.
1158                          *
1159                          * Since we tend to visit the same clauses over and over when
1160                          * planning a large query, we cache the bucketsize estimate in
1161                          * the RestrictInfo node to avoid repeated lookups of
1162                          * statistics.
1163                          */
1164                         if (bms_is_subset(restrictinfo->right_relids,
1165                                                           inner_path->parent->relids))
1166                         {
1167                                 /* righthand side is inner */
1168                                 thisbucketsize = restrictinfo->right_bucketsize;
1169                                 if (thisbucketsize < 0)
1170                                 {
1171                                         /* not cached yet */
1172                                         thisbucketsize =
1173                                                 estimate_hash_bucketsize(root,
1174                                                                            get_rightop(restrictinfo->clause),
1175                                                                                                  virtualbuckets);
1176                                         restrictinfo->right_bucketsize = thisbucketsize;
1177                                 }
1178                         }
1179                         else
1180                         {
1181                                 Assert(bms_is_subset(restrictinfo->left_relids,
1182                                                                          inner_path->parent->relids));
1183                                 /* lefthand side is inner */
1184                                 thisbucketsize = restrictinfo->left_bucketsize;
1185                                 if (thisbucketsize < 0)
1186                                 {
1187                                         /* not cached yet */
1188                                         thisbucketsize =
1189                                                 estimate_hash_bucketsize(root,
1190                                                                                 get_leftop(restrictinfo->clause),
1191                                                                                                  virtualbuckets);
1192                                         restrictinfo->left_bucketsize = thisbucketsize;
1193                                 }
1194                         }
1195
1196                         if (innerbucketsize > thisbucketsize)
1197                                 innerbucketsize = thisbucketsize;
1198                 }
1199         }
1200
1201         /*
1202          * If inner relation is too big then we will need to "batch" the join,
1203          * which implies writing and reading most of the tuples to disk an
1204          * extra time.  Charge one cost unit per page of I/O (correct since it
1205          * should be nice and sequential...).  Writing the inner rel counts as
1206          * startup cost, all the rest as run cost.
1207          */
1208         if (numbatches > 1)
1209         {
1210                 double          outerpages = page_size(outer_path_rows,
1211                                                                                    outer_path->parent->width);
1212                 double          innerpages = page_size(inner_path_rows,
1213                                                                                    inner_path->parent->width);
1214
1215                 startup_cost += innerpages;
1216                 run_cost += innerpages + 2 * outerpages;
1217         }
1218
1219         /* CPU costs */
1220
1221         /*
1222          * If we're doing JOIN_IN then we will stop comparing inner tuples to
1223          * an outer tuple as soon as we have one match.  Account for the
1224          * effects of this by scaling down the cost estimates in proportion to
1225          * the expected output size.  (This assumes that all the quals
1226          * attached to the join are IN quals, which should be true.)
1227          */
1228         joininfactor = join_in_selectivity(&path->jpath, root);
1229
1230         /*
1231          * The number of tuple comparisons needed is the number of outer
1232          * tuples times the typical number of tuples in a hash bucket, which
1233          * is the inner relation size times its bucketsize fraction.  At each
1234          * one, we need to evaluate the hashjoin quals.  (Note: charging the
1235          * full qual eval cost at each tuple is pessimistic, since we don't
1236          * evaluate the quals unless the hash values match exactly.)
1237          */
1238         startup_cost += hash_qual_cost.startup;
1239         run_cost += hash_qual_cost.per_tuple *
1240                 outer_path_rows * clamp_row_est(inner_path_rows * innerbucketsize) *
1241                 joininfactor;
1242
1243         /*
1244          * For each tuple that gets through the hashjoin proper, we charge
1245          * cpu_tuple_cost plus the cost of evaluating additional restriction
1246          * clauses that are to be applied at the join.  (This is pessimistic
1247          * since not all of the quals may get evaluated at each tuple.)
1248          */
1249         startup_cost += qp_qual_cost.startup;
1250         cpu_per_tuple = cpu_tuple_cost + qp_qual_cost.per_tuple;
1251         run_cost += cpu_per_tuple * hashjointuples * joininfactor;
1252
1253         /*
1254          * Bias against putting larger relation on inside.      We don't want an
1255          * absolute prohibition, though, since larger relation might have
1256          * better bucketsize --- and we can't trust the size estimates
1257          * unreservedly, anyway.  Instead, inflate the run cost by the square
1258          * root of the size ratio.      (Why square root?  No real good reason,
1259          * but it seems reasonable...)
1260          *
1261          * Note: before 7.4 we implemented this by inflating startup cost; but if
1262          * there's a disable_cost component in the input paths' startup cost,
1263          * that unfairly penalizes the hash.  Probably it'd be better to keep
1264          * track of disable penalty separately from cost.
1265          */
1266         if (innerbytes > outerbytes && outerbytes > 0)
1267                 run_cost *= sqrt(innerbytes / outerbytes);
1268
1269         path->jpath.path.startup_cost = startup_cost;
1270         path->jpath.path.total_cost = startup_cost + run_cost;
1271 }
1272
1273
1274 /*
1275  * cost_qual_eval
1276  *              Estimate the CPU costs of evaluating a WHERE clause.
1277  *              The input can be either an implicitly-ANDed list of boolean
1278  *              expressions, or a list of RestrictInfo nodes.
1279  *              The result includes both a one-time (startup) component,
1280  *              and a per-evaluation component.
1281  */
1282 void
1283 cost_qual_eval(QualCost *cost, List *quals)
1284 {
1285         ListCell   *l;
1286
1287         cost->startup = 0;
1288         cost->per_tuple = 0;
1289
1290         /* We don't charge any cost for the implicit ANDing at top level ... */
1291
1292         foreach(l, quals)
1293         {
1294                 Node       *qual = (Node *) lfirst(l);
1295
1296                 /*
1297                  * RestrictInfo nodes contain an eval_cost field reserved for this
1298                  * routine's use, so that it's not necessary to evaluate the qual
1299                  * clause's cost more than once.  If the clause's cost hasn't been
1300                  * computed yet, the field's startup value will contain -1.
1301                  */
1302                 if (qual && IsA(qual, RestrictInfo))
1303                 {
1304                         RestrictInfo *restrictinfo = (RestrictInfo *) qual;
1305
1306                         if (restrictinfo->eval_cost.startup < 0)
1307                         {
1308                                 restrictinfo->eval_cost.startup = 0;
1309                                 restrictinfo->eval_cost.per_tuple = 0;
1310                                 cost_qual_eval_walker((Node *) restrictinfo->clause,
1311                                                                           &restrictinfo->eval_cost);
1312                         }
1313                         cost->startup += restrictinfo->eval_cost.startup;
1314                         cost->per_tuple += restrictinfo->eval_cost.per_tuple;
1315                 }
1316                 else
1317                 {
1318                         /* If it's a bare expression, must always do it the hard way */
1319                         cost_qual_eval_walker(qual, cost);
1320                 }
1321         }
1322 }
1323
1324 static bool
1325 cost_qual_eval_walker(Node *node, QualCost *total)
1326 {
1327         if (node == NULL)
1328                 return false;
1329
1330         /*
1331          * Our basic strategy is to charge one cpu_operator_cost for each
1332          * operator or function node in the given tree.  Vars and Consts are
1333          * charged zero, and so are boolean operators (AND, OR, NOT).
1334          * Simplistic, but a lot better than no model at all.
1335          *
1336          * Should we try to account for the possibility of short-circuit
1337          * evaluation of AND/OR?
1338          */
1339         if (IsA(node, FuncExpr) ||
1340                 IsA(node, OpExpr) ||
1341                 IsA(node, DistinctExpr) ||
1342                 IsA(node, NullIfExpr))
1343                 total->per_tuple += cpu_operator_cost;
1344         else if (IsA(node, ScalarArrayOpExpr))
1345         {
1346                 /* should charge more than 1 op cost, but how many? */
1347                 total->per_tuple += cpu_operator_cost * 10;
1348         }
1349         else if (IsA(node, SubLink))
1350         {
1351                 /* This routine should not be applied to un-planned expressions */
1352                 elog(ERROR, "cannot handle unplanned sub-select");
1353         }
1354         else if (IsA(node, SubPlan))
1355         {
1356                 /*
1357                  * A subplan node in an expression typically indicates that the
1358                  * subplan will be executed on each evaluation, so charge
1359                  * accordingly. (Sub-selects that can be executed as InitPlans
1360                  * have already been removed from the expression.)
1361                  *
1362                  * An exception occurs when we have decided we can implement the
1363                  * subplan by hashing.
1364                  *
1365                  */
1366                 SubPlan    *subplan = (SubPlan *) node;
1367                 Plan       *plan = subplan->plan;
1368
1369                 if (subplan->useHashTable)
1370                 {
1371                         /*
1372                          * If we are using a hash table for the subquery outputs, then
1373                          * the cost of evaluating the query is a one-time cost. We
1374                          * charge one cpu_operator_cost per tuple for the work of
1375                          * loading the hashtable, too.
1376                          */
1377                         total->startup += plan->total_cost +
1378                                 cpu_operator_cost * plan->plan_rows;
1379
1380                         /*
1381                          * The per-tuple costs include the cost of evaluating the
1382                          * lefthand expressions, plus the cost of probing the
1383                          * hashtable. Recursion into the exprs list will handle the
1384                          * lefthand expressions properly, and will count one
1385                          * cpu_operator_cost for each comparison operator.      That is
1386                          * probably too low for the probing cost, but it's hard to
1387                          * make a better estimate, so live with it for now.
1388                          */
1389                 }
1390                 else
1391                 {
1392                         /*
1393                          * Otherwise we will be rescanning the subplan output on each
1394                          * evaluation.  We need to estimate how much of the output we
1395                          * will actually need to scan.  NOTE: this logic should agree
1396                          * with the estimates used by make_subplan() in
1397                          * plan/subselect.c.
1398                          */
1399                         Cost            plan_run_cost = plan->total_cost - plan->startup_cost;
1400
1401                         if (subplan->subLinkType == EXISTS_SUBLINK)
1402                         {
1403                                 /* we only need to fetch 1 tuple */
1404                                 total->per_tuple += plan_run_cost / plan->plan_rows;
1405                         }
1406                         else if (subplan->subLinkType == ALL_SUBLINK ||
1407                                          subplan->subLinkType == ANY_SUBLINK)
1408                         {
1409                                 /* assume we need 50% of the tuples */
1410                                 total->per_tuple += 0.50 * plan_run_cost;
1411                                 /* also charge a cpu_operator_cost per row examined */
1412                                 total->per_tuple += 0.50 * plan->plan_rows * cpu_operator_cost;
1413                         }
1414                         else
1415                         {
1416                                 /* assume we need all tuples */
1417                                 total->per_tuple += plan_run_cost;
1418                         }
1419
1420                         /*
1421                          * Also account for subplan's startup cost. If the subplan is
1422                          * uncorrelated or undirect correlated, AND its topmost node
1423                          * is a Sort or Material node, assume that we'll only need to
1424                          * pay its startup cost once; otherwise assume we pay the
1425                          * startup cost every time.
1426                          */
1427                         if (subplan->parParam == NIL &&
1428                                 (IsA(plan, Sort) ||
1429                                  IsA(plan, Material)))
1430                                 total->startup += plan->startup_cost;
1431                         else
1432                                 total->per_tuple += plan->startup_cost;
1433                 }
1434         }
1435
1436         return expression_tree_walker(node, cost_qual_eval_walker,
1437                                                                   (void *) total);
1438 }
1439
1440
1441 /*
1442  * approx_selectivity
1443  *              Quick-and-dirty estimation of clause selectivities.
1444  *              The input can be either an implicitly-ANDed list of boolean
1445  *              expressions, or a list of RestrictInfo nodes (typically the latter).
1446  *
1447  * This is quick-and-dirty because we bypass clauselist_selectivity, and
1448  * simply multiply the independent clause selectivities together.  Now
1449  * clauselist_selectivity often can't do any better than that anyhow, but
1450  * for some situations (such as range constraints) it is smarter.  However,
1451  * we can't effectively cache the results of clauselist_selectivity, whereas
1452  * the individual clause selectivities can be and are cached.
1453  *
1454  * Since we are only using the results to estimate how many potential
1455  * output tuples are generated and passed through qpqual checking, it
1456  * seems OK to live with the approximation.
1457  */
1458 static Selectivity
1459 approx_selectivity(Query *root, List *quals, JoinType jointype)
1460 {
1461         Selectivity total = 1.0;
1462         ListCell   *l;
1463
1464         foreach(l, quals)
1465         {
1466                 Node       *qual = (Node *) lfirst(l);
1467
1468                 /* Note that clause_selectivity will be able to cache its result */
1469                 total *= clause_selectivity(root, qual, 0, jointype);
1470         }
1471         return total;
1472 }
1473
1474
1475 /*
1476  * set_baserel_size_estimates
1477  *              Set the size estimates for the given base relation.
1478  *
1479  * The rel's targetlist and restrictinfo list must have been constructed
1480  * already.
1481  *
1482  * We set the following fields of the rel node:
1483  *      rows: the estimated number of output tuples (after applying
1484  *                restriction clauses).
1485  *      width: the estimated average output tuple width in bytes.
1486  *      baserestrictcost: estimated cost of evaluating baserestrictinfo clauses.
1487  */
1488 void
1489 set_baserel_size_estimates(Query *root, RelOptInfo *rel)
1490 {
1491         double          nrows;
1492
1493         /* Should only be applied to base relations */
1494         Assert(rel->relid > 0);
1495
1496         nrows = rel->tuples *
1497                 clauselist_selectivity(root,
1498                                                            rel->baserestrictinfo,
1499                                                            0,
1500                                                            JOIN_INNER);
1501
1502         rel->rows = clamp_row_est(nrows);
1503
1504         cost_qual_eval(&rel->baserestrictcost, rel->baserestrictinfo);
1505
1506         set_rel_width(root, rel);
1507 }
1508
1509 /*
1510  * set_joinrel_size_estimates
1511  *              Set the size estimates for the given join relation.
1512  *
1513  * The rel's targetlist must have been constructed already, and a
1514  * restriction clause list that matches the given component rels must
1515  * be provided.
1516  *
1517  * Since there is more than one way to make a joinrel for more than two
1518  * base relations, the results we get here could depend on which component
1519  * rel pair is provided.  In theory we should get the same answers no matter
1520  * which pair is provided; in practice, since the selectivity estimation
1521  * routines don't handle all cases equally well, we might not.  But there's
1522  * not much to be done about it.  (Would it make sense to repeat the
1523  * calculations for each pair of input rels that's encountered, and somehow
1524  * average the results?  Probably way more trouble than it's worth.)
1525  *
1526  * It's important that the results for symmetric JoinTypes be symmetric,
1527  * eg, (rel1, rel2, JOIN_LEFT) should produce the same result as (rel2,
1528  * rel1, JOIN_RIGHT).  Also, JOIN_IN should produce the same result as
1529  * JOIN_UNIQUE_INNER, likewise JOIN_REVERSE_IN == JOIN_UNIQUE_OUTER.
1530  *
1531  * We set only the rows field here.  The width field was already set by
1532  * build_joinrel_tlist, and baserestrictcost is not used for join rels.
1533  */
1534 void
1535 set_joinrel_size_estimates(Query *root, RelOptInfo *rel,
1536                                                    RelOptInfo *outer_rel,
1537                                                    RelOptInfo *inner_rel,
1538                                                    JoinType jointype,
1539                                                    List *restrictlist)
1540 {
1541         Selectivity selec;
1542         double          nrows;
1543         UniquePath *upath;
1544
1545         /*
1546          * Compute joinclause selectivity.      Note that we are only considering
1547          * clauses that become restriction clauses at this join level; we are
1548          * not double-counting them because they were not considered in
1549          * estimating the sizes of the component rels.
1550          */
1551         selec = clauselist_selectivity(root,
1552                                                                    restrictlist,
1553                                                                    0,
1554                                                                    jointype);
1555
1556         /*
1557          * Basically, we multiply size of Cartesian product by selectivity.
1558          *
1559          * If we are doing an outer join, take that into account: the output must
1560          * be at least as large as the non-nullable input.      (Is there any
1561          * chance of being even smarter?)
1562          *
1563          * For JOIN_IN and variants, the Cartesian product is figured with
1564          * respect to a unique-ified input, and then we can clamp to the size
1565          * of the other input.
1566          */
1567         switch (jointype)
1568         {
1569                 case JOIN_INNER:
1570                         nrows = outer_rel->rows * inner_rel->rows * selec;
1571                         break;
1572                 case JOIN_LEFT:
1573                         nrows = outer_rel->rows * inner_rel->rows * selec;
1574                         if (nrows < outer_rel->rows)
1575                                 nrows = outer_rel->rows;
1576                         break;
1577                 case JOIN_RIGHT:
1578                         nrows = outer_rel->rows * inner_rel->rows * selec;
1579                         if (nrows < inner_rel->rows)
1580                                 nrows = inner_rel->rows;
1581                         break;
1582                 case JOIN_FULL:
1583                         nrows = outer_rel->rows * inner_rel->rows * selec;
1584                         if (nrows < outer_rel->rows)
1585                                 nrows = outer_rel->rows;
1586                         if (nrows < inner_rel->rows)
1587                                 nrows = inner_rel->rows;
1588                         break;
1589                 case JOIN_IN:
1590                 case JOIN_UNIQUE_INNER:
1591                         upath = create_unique_path(root, inner_rel,
1592                                                                            inner_rel->cheapest_total_path);
1593                         nrows = outer_rel->rows * upath->rows * selec;
1594                         if (nrows > outer_rel->rows)
1595                                 nrows = outer_rel->rows;
1596                         break;
1597                 case JOIN_REVERSE_IN:
1598                 case JOIN_UNIQUE_OUTER:
1599                         upath = create_unique_path(root, outer_rel,
1600                                                                            outer_rel->cheapest_total_path);
1601                         nrows = upath->rows * inner_rel->rows * selec;
1602                         if (nrows > inner_rel->rows)
1603                                 nrows = inner_rel->rows;
1604                         break;
1605                 default:
1606                         elog(ERROR, "unrecognized join type: %d", (int) jointype);
1607                         nrows = 0;                      /* keep compiler quiet */
1608                         break;
1609         }
1610
1611         rel->rows = clamp_row_est(nrows);
1612 }
1613
1614 /*
1615  * join_in_selectivity
1616  *        Determines the factor by which a JOIN_IN join's result is expected
1617  *        to be smaller than an ordinary inner join.
1618  *
1619  * 'path' is already filled in except for the cost fields
1620  */
1621 static Selectivity
1622 join_in_selectivity(JoinPath *path, Query *root)
1623 {
1624         RelOptInfo *innerrel;
1625         UniquePath *innerunique;
1626         Selectivity selec;
1627         double          nrows;
1628
1629         /* Return 1.0 whenever it's not JOIN_IN */
1630         if (path->jointype != JOIN_IN)
1631                 return 1.0;
1632
1633         /*
1634          * Return 1.0 if the inner side is already known unique.  The case
1635          * where the inner path is already a UniquePath probably cannot happen
1636          * in current usage, but check it anyway for completeness.      The
1637          * interesting case is where we've determined the inner relation
1638          * itself is unique, which we can check by looking at the rows
1639          * estimate for its UniquePath.
1640          */
1641         if (IsA(path->innerjoinpath, UniquePath))
1642                 return 1.0;
1643         innerrel = path->innerjoinpath->parent;
1644         innerunique = create_unique_path(root,
1645                                                                          innerrel,
1646                                                                          innerrel->cheapest_total_path);
1647         if (innerunique->rows >= innerrel->rows)
1648                 return 1.0;
1649
1650         /*
1651          * Compute same result set_joinrel_size_estimates would compute for
1652          * JOIN_INNER.  Note that we use the input rels' absolute size
1653          * estimates, not PATH_ROWS() which might be less; if we used
1654          * PATH_ROWS() we'd be double-counting the effects of any join clauses
1655          * used in input scans.
1656          */
1657         selec = clauselist_selectivity(root,
1658                                                                    path->joinrestrictinfo,
1659                                                                    0,
1660                                                                    JOIN_INNER);
1661         nrows = path->outerjoinpath->parent->rows * innerrel->rows * selec;
1662
1663         nrows = clamp_row_est(nrows);
1664
1665         /* See if it's larger than the actual JOIN_IN size estimate */
1666         if (nrows > path->path.parent->rows)
1667                 return path->path.parent->rows / nrows;
1668         else
1669                 return 1.0;
1670 }
1671
1672 /*
1673  * set_function_size_estimates
1674  *              Set the size estimates for a base relation that is a function call.
1675  *
1676  * The rel's targetlist and restrictinfo list must have been constructed
1677  * already.
1678  *
1679  * We set the same fields as set_baserel_size_estimates.
1680  */
1681 void
1682 set_function_size_estimates(Query *root, RelOptInfo *rel)
1683 {
1684         /* Should only be applied to base relations that are functions */
1685         Assert(rel->relid > 0);
1686         Assert(rel->rtekind == RTE_FUNCTION);
1687
1688         /*
1689          * Estimate number of rows the function itself will return.
1690          *
1691          * XXX no idea how to do this yet; but should at least check whether
1692          * function returns set or not...
1693          */
1694         rel->tuples = 1000;
1695
1696         /* Now estimate number of output rows, etc */
1697         set_baserel_size_estimates(root, rel);
1698 }
1699
1700
1701 /*
1702  * set_rel_width
1703  *              Set the estimated output width of a base relation.
1704  *
1705  * NB: this works best on plain relations because it prefers to look at
1706  * real Vars.  It will fail to make use of pg_statistic info when applied
1707  * to a subquery relation, even if the subquery outputs are simple vars
1708  * that we could have gotten info for.  Is it worth trying to be smarter
1709  * about subqueries?
1710  *
1711  * The per-attribute width estimates are cached for possible re-use while
1712  * building join relations.
1713  */
1714 static void
1715 set_rel_width(Query *root, RelOptInfo *rel)
1716 {
1717         int32           tuple_width = 0;
1718         ListCell   *tllist;
1719
1720         foreach(tllist, rel->reltargetlist)
1721         {
1722                 Var                *var = (Var *) lfirst(tllist);
1723                 int                     ndx;
1724                 Oid                     relid;
1725                 int32           item_width;
1726
1727                 /* For now, punt on whole-row child Vars */
1728                 if (!IsA(var, Var))
1729                 {
1730                         tuple_width += 32;      /* arbitrary */
1731                         continue;
1732                 }
1733
1734                 ndx = var->varattno - rel->min_attr;
1735
1736                 /*
1737                  * The width probably hasn't been cached yet, but may as well
1738                  * check
1739                  */
1740                 if (rel->attr_widths[ndx] > 0)
1741                 {
1742                         tuple_width += rel->attr_widths[ndx];
1743                         continue;
1744                 }
1745
1746                 relid = getrelid(var->varno, root->rtable);
1747                 if (relid != InvalidOid)
1748                 {
1749                         item_width = get_attavgwidth(relid, var->varattno);
1750                         if (item_width > 0)
1751                         {
1752                                 rel->attr_widths[ndx] = item_width;
1753                                 tuple_width += item_width;
1754                                 continue;
1755                         }
1756                 }
1757
1758                 /*
1759                  * Not a plain relation, or can't find statistics for it. Estimate
1760                  * using just the type info.
1761                  */
1762                 item_width = get_typavgwidth(var->vartype, var->vartypmod);
1763                 Assert(item_width > 0);
1764                 rel->attr_widths[ndx] = item_width;
1765                 tuple_width += item_width;
1766         }
1767         Assert(tuple_width >= 0);
1768         rel->width = tuple_width;
1769 }
1770
1771 /*
1772  * relation_byte_size
1773  *        Estimate the storage space in bytes for a given number of tuples
1774  *        of a given width (size in bytes).
1775  */
1776 static double
1777 relation_byte_size(double tuples, int width)
1778 {
1779         return tuples * (MAXALIGN(width) + MAXALIGN(sizeof(HeapTupleHeaderData)));
1780 }
1781
1782 /*
1783  * page_size
1784  *        Returns an estimate of the number of pages covered by a given
1785  *        number of tuples of a given width (size in bytes).
1786  */
1787 static double
1788 page_size(double tuples, int width)
1789 {
1790         return ceil(relation_byte_size(tuples, width) / BLCKSZ);
1791 }