~vcs-imports/mammoth-replicator/trunk

« back to all changes in this revision

Viewing changes to src/backend/optimizer/path/costsize.c

  • Committer: alvherre
  • Date: 2005-12-16 21:24:52 UTC
  • Revision ID: svn-v4:db760fc0-0f08-0410-9d63-cc6633f64896:trunk:1
Initial import of the REL8_0_3 sources from the Pgsql CVS repository.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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.137.4.1 2005-04-04 01:43:23 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
 * 'baserel' is the base relation the index is for
 
231
 * 'index' is the index to be used
 
232
 * 'indexQuals' is the list of applicable qual clauses (implicit AND semantics)
 
233
 * 'is_injoin' is T if we are considering using the index scan as the inside
 
234
 *              of a nestloop join (hence, some of the indexQuals are join clauses)
 
235
 *
 
236
 * NOTE: 'indexQuals' must contain only clauses usable as index restrictions.
 
237
 * Any additional quals evaluated as qpquals may reduce the number of returned
 
238
 * tuples, but they won't reduce the number of tuples we have to fetch from
 
239
 * the table, so they don't reduce the scan cost.
 
240
 *
 
241
 * NOTE: as of 8.0, indexQuals is a list of RestrictInfo nodes, where formerly
 
242
 * it was a list of bare clause expressions.
 
243
 */
 
244
void
 
245
cost_index(Path *path, Query *root,
 
246
                   RelOptInfo *baserel,
 
247
                   IndexOptInfo *index,
 
248
                   List *indexQuals,
 
249
                   bool is_injoin)
 
250
{
 
251
        Cost            startup_cost = 0;
 
252
        Cost            run_cost = 0;
 
253
        Cost            indexStartupCost;
 
254
        Cost            indexTotalCost;
 
255
        Selectivity indexSelectivity;
 
256
        double          indexCorrelation,
 
257
                                csquared;
 
258
        Cost            min_IO_cost,
 
259
                                max_IO_cost;
 
260
        Cost            cpu_per_tuple;
 
261
        double          tuples_fetched;
 
262
        double          pages_fetched;
 
263
        double          T,
 
264
                                b;
 
265
 
 
266
        /* Should only be applied to base relations */
 
267
        Assert(IsA(baserel, RelOptInfo) &&
 
268
                   IsA(index, IndexOptInfo));
 
269
        Assert(baserel->relid > 0);
 
270
        Assert(baserel->rtekind == RTE_RELATION);
 
271
 
 
272
        if (!enable_indexscan)
 
273
                startup_cost += disable_cost;
 
274
 
 
275
        /*
 
276
         * Call index-access-method-specific code to estimate the processing
 
277
         * cost for scanning the index, as well as the selectivity of the
 
278
         * index (ie, the fraction of main-table tuples we will have to
 
279
         * retrieve) and its correlation to the main-table tuple order.
 
280
         */
 
281
        OidFunctionCall8(index->amcostestimate,
 
282
                                         PointerGetDatum(root),
 
283
                                         PointerGetDatum(baserel),
 
284
                                         PointerGetDatum(index),
 
285
                                         PointerGetDatum(indexQuals),
 
286
                                         PointerGetDatum(&indexStartupCost),
 
287
                                         PointerGetDatum(&indexTotalCost),
 
288
                                         PointerGetDatum(&indexSelectivity),
 
289
                                         PointerGetDatum(&indexCorrelation));
 
290
 
 
291
        /* all costs for touching index itself included here */
 
292
        startup_cost += indexStartupCost;
 
293
        run_cost += indexTotalCost - indexStartupCost;
 
294
 
 
295
        /*----------
 
296
         * Estimate number of main-table tuples and pages fetched.
 
297
         *
 
298
         * When the index ordering is uncorrelated with the table ordering,
 
299
         * we use an approximation proposed by Mackert and Lohman, "Index Scans
 
300
         * Using a Finite LRU Buffer: A Validated I/O Model", ACM Transactions
 
301
         * on Database Systems, Vol. 14, No. 3, September 1989, Pages 401-424.
 
302
         * The Mackert and Lohman approximation is that the number of pages
 
303
         * fetched is
 
304
         *      PF =
 
305
         *              min(2TNs/(2T+Ns), T)                    when T <= b
 
306
         *              2TNs/(2T+Ns)                                    when T > b and Ns <= 2Tb/(2T-b)
 
307
         *              b + (Ns - 2Tb/(2T-b))*(T-b)/T   when T > b and Ns > 2Tb/(2T-b)
 
308
         * where
 
309
         *              T = # pages in table
 
310
         *              N = # tuples in table
 
311
         *              s = selectivity = fraction of table to be scanned
 
312
         *              b = # buffer pages available (we include kernel space here)
 
313
         *
 
314
         * When the index ordering is exactly correlated with the table ordering
 
315
         * (just after a CLUSTER, for example), the number of pages fetched should
 
316
         * be just sT.  What's more, these will be sequential fetches, not the
 
317
         * random fetches that occur in the uncorrelated case.  So, depending on
 
318
         * the extent of correlation, we should estimate the actual I/O cost
 
319
         * somewhere between s * T * 1.0 and PF * random_cost.  We currently
 
320
         * interpolate linearly between these two endpoints based on the
 
321
         * correlation squared (XXX is that appropriate?).
 
322
         *
 
323
         * In any case the number of tuples fetched is Ns.
 
324
         *----------
 
325
         */
 
326
 
 
327
        tuples_fetched = clamp_row_est(indexSelectivity * baserel->tuples);
 
328
 
 
329
        /* This part is the Mackert and Lohman formula */
 
330
 
 
331
        T = (baserel->pages > 1) ? (double) baserel->pages : 1.0;
 
332
        b = (effective_cache_size > 1) ? effective_cache_size : 1.0;
 
333
 
 
334
        if (T <= b)
 
335
        {
 
336
                pages_fetched =
 
337
                        (2.0 * T * tuples_fetched) / (2.0 * T + tuples_fetched);
 
338
                if (pages_fetched > T)
 
339
                        pages_fetched = T;
 
340
        }
 
341
        else
 
342
        {
 
343
                double          lim;
 
344
 
 
345
                lim = (2.0 * T * b) / (2.0 * T - b);
 
346
                if (tuples_fetched <= lim)
 
347
                {
 
348
                        pages_fetched =
 
349
                                (2.0 * T * tuples_fetched) / (2.0 * T + tuples_fetched);
 
350
                }
 
351
                else
 
352
                {
 
353
                        pages_fetched =
 
354
                                b + (tuples_fetched - lim) * (T - b) / T;
 
355
                }
 
356
        }
 
357
 
 
358
        /*
 
359
         * min_IO_cost corresponds to the perfectly correlated case
 
360
         * (csquared=1), max_IO_cost to the perfectly uncorrelated case
 
361
         * (csquared=0).  Note that we just charge random_page_cost per page
 
362
         * in the uncorrelated case, rather than using
 
363
         * cost_nonsequential_access, since we've already accounted for
 
364
         * caching effects by using the Mackert model.
 
365
         */
 
366
        min_IO_cost = ceil(indexSelectivity * T);
 
367
        max_IO_cost = pages_fetched * random_page_cost;
 
368
 
 
369
        /*
 
370
         * Now interpolate based on estimated index order correlation to get
 
371
         * total disk I/O cost for main table accesses.
 
372
         */
 
373
        csquared = indexCorrelation * indexCorrelation;
 
374
 
 
375
        run_cost += max_IO_cost + csquared * (min_IO_cost - max_IO_cost);
 
376
 
 
377
        /*
 
378
         * Estimate CPU costs per tuple.
 
379
         *
 
380
         * Normally the indexquals will be removed from the list of restriction
 
381
         * clauses that we have to evaluate as qpquals, so we should subtract
 
382
         * their costs from baserestrictcost.  But if we are doing a join then
 
383
         * some of the indexquals are join clauses and shouldn't be
 
384
         * subtracted. Rather than work out exactly how much to subtract, we
 
385
         * don't subtract anything.
 
386
         */
 
387
        startup_cost += baserel->baserestrictcost.startup;
 
388
        cpu_per_tuple = cpu_tuple_cost + baserel->baserestrictcost.per_tuple;
 
389
 
 
390
        if (!is_injoin)
 
391
        {
 
392
                QualCost        index_qual_cost;
 
393
 
 
394
                cost_qual_eval(&index_qual_cost, indexQuals);
 
395
                /* any startup cost still has to be paid ... */
 
396
                cpu_per_tuple -= index_qual_cost.per_tuple;
 
397
        }
 
398
 
 
399
        run_cost += cpu_per_tuple * tuples_fetched;
 
400
 
 
401
        path->startup_cost = startup_cost;
 
402
        path->total_cost = startup_cost + run_cost;
 
403
}
 
404
 
 
405
/*
 
406
 * cost_tidscan
 
407
 *        Determines and returns the cost of scanning a relation using TIDs.
 
408
 */
 
409
void
 
410
cost_tidscan(Path *path, Query *root,
 
411
                         RelOptInfo *baserel, List *tideval)
 
412
{
 
413
        Cost            startup_cost = 0;
 
414
        Cost            run_cost = 0;
 
415
        Cost            cpu_per_tuple;
 
416
        int                     ntuples = list_length(tideval);
 
417
 
 
418
        /* Should only be applied to base relations */
 
419
        Assert(baserel->relid > 0);
 
420
        Assert(baserel->rtekind == RTE_RELATION);
 
421
 
 
422
        if (!enable_tidscan)
 
423
                startup_cost += disable_cost;
 
424
 
 
425
        /* disk costs --- assume each tuple on a different page */
 
426
        run_cost += random_page_cost * ntuples;
 
427
 
 
428
        /* CPU costs */
 
429
        startup_cost += baserel->baserestrictcost.startup;
 
430
        cpu_per_tuple = cpu_tuple_cost + baserel->baserestrictcost.per_tuple;
 
431
        run_cost += cpu_per_tuple * ntuples;
 
432
 
 
433
        path->startup_cost = startup_cost;
 
434
        path->total_cost = startup_cost + run_cost;
 
435
}
 
436
 
 
437
/*
 
438
 * cost_subqueryscan
 
439
 *        Determines and returns the cost of scanning a subquery RTE.
 
440
 */
 
441
void
 
442
cost_subqueryscan(Path *path, RelOptInfo *baserel)
 
443
{
 
444
        Cost            startup_cost;
 
445
        Cost            run_cost;
 
446
        Cost            cpu_per_tuple;
 
447
 
 
448
        /* Should only be applied to base relations that are subqueries */
 
449
        Assert(baserel->relid > 0);
 
450
        Assert(baserel->rtekind == RTE_SUBQUERY);
 
451
 
 
452
        /*
 
453
         * Cost of path is cost of evaluating the subplan, plus cost of
 
454
         * evaluating any restriction clauses that will be attached to the
 
455
         * SubqueryScan node, plus cpu_tuple_cost to account for selection and
 
456
         * projection overhead.
 
457
         */
 
458
        path->startup_cost = baserel->subplan->startup_cost;
 
459
        path->total_cost = baserel->subplan->total_cost;
 
460
 
 
461
        startup_cost = baserel->baserestrictcost.startup;
 
462
        cpu_per_tuple = cpu_tuple_cost + baserel->baserestrictcost.per_tuple;
 
463
        run_cost = cpu_per_tuple * baserel->tuples;
 
464
 
 
465
        path->startup_cost += startup_cost;
 
466
        path->total_cost += startup_cost + run_cost;
 
467
}
 
468
 
 
469
/*
 
470
 * cost_functionscan
 
471
 *        Determines and returns the cost of scanning a function RTE.
 
472
 */
 
473
void
 
474
cost_functionscan(Path *path, Query *root, RelOptInfo *baserel)
 
475
{
 
476
        Cost            startup_cost = 0;
 
477
        Cost            run_cost = 0;
 
478
        Cost            cpu_per_tuple;
 
479
 
 
480
        /* Should only be applied to base relations that are functions */
 
481
        Assert(baserel->relid > 0);
 
482
        Assert(baserel->rtekind == RTE_FUNCTION);
 
483
 
 
484
        /*
 
485
         * For now, estimate function's cost at one operator eval per function
 
486
         * call.  Someday we should revive the function cost estimate columns
 
487
         * in pg_proc...
 
488
         */
 
489
        cpu_per_tuple = cpu_operator_cost;
 
490
 
 
491
        /* Add scanning CPU costs */
 
492
        startup_cost += baserel->baserestrictcost.startup;
 
493
        cpu_per_tuple += cpu_tuple_cost + baserel->baserestrictcost.per_tuple;
 
494
        run_cost += cpu_per_tuple * baserel->tuples;
 
495
 
 
496
        path->startup_cost = startup_cost;
 
497
        path->total_cost = startup_cost + run_cost;
 
498
}
 
499
 
 
500
/*
 
501
 * cost_sort
 
502
 *        Determines and returns the cost of sorting a relation, including
 
503
 *        the cost of reading the input data.
 
504
 *
 
505
 * If the total volume of data to sort is less than work_mem, we will do
 
506
 * an in-memory sort, which requires no I/O and about t*log2(t) tuple
 
507
 * comparisons for t tuples.
 
508
 *
 
509
 * If the total volume exceeds work_mem, we switch to a tape-style merge
 
510
 * algorithm.  There will still be about t*log2(t) tuple comparisons in
 
511
 * total, but we will also need to write and read each tuple once per
 
512
 * merge pass.  We expect about ceil(log6(r)) merge passes where r is the
 
513
 * number of initial runs formed (log6 because tuplesort.c uses six-tape
 
514
 * merging).  Since the average initial run should be about twice work_mem,
 
515
 * we have
 
516
 *              disk traffic = 2 * relsize * ceil(log6(p / (2*work_mem)))
 
517
 *              cpu = comparison_cost * t * log2(t)
 
518
 *
 
519
 * The disk traffic is assumed to be half sequential and half random
 
520
 * accesses (XXX can't we refine that guess?)
 
521
 *
 
522
 * We charge two operator evals per tuple comparison, which should be in
 
523
 * the right ballpark in most cases.
 
524
 *
 
525
 * 'pathkeys' is a list of sort keys
 
526
 * 'input_cost' is the total cost for reading the input data
 
527
 * 'tuples' is the number of tuples in the relation
 
528
 * 'width' is the average tuple width in bytes
 
529
 *
 
530
 * NOTE: some callers currently pass NIL for pathkeys because they
 
531
 * can't conveniently supply the sort keys.  Since this routine doesn't
 
532
 * currently do anything with pathkeys anyway, that doesn't matter...
 
533
 * but if it ever does, it should react gracefully to lack of key data.
 
534
 * (Actually, the thing we'd most likely be interested in is just the number
 
535
 * of sort keys, which all callers *could* supply.)
 
536
 */
 
537
void
 
538
cost_sort(Path *path, Query *root,
 
539
                  List *pathkeys, Cost input_cost, double tuples, int width)
 
540
{
 
541
        Cost            startup_cost = input_cost;
 
542
        Cost            run_cost = 0;
 
543
        double          nbytes = relation_byte_size(tuples, width);
 
544
        long            work_mem_bytes = work_mem * 1024L;
 
545
 
 
546
        if (!enable_sort)
 
547
                startup_cost += disable_cost;
 
548
 
 
549
        /*
 
550
         * We want to be sure the cost of a sort is never estimated as zero,
 
551
         * even if passed-in tuple count is zero.  Besides, mustn't do
 
552
         * log(0)...
 
553
         */
 
554
        if (tuples < 2.0)
 
555
                tuples = 2.0;
 
556
 
 
557
        /*
 
558
         * CPU costs
 
559
         *
 
560
         * Assume about two operator evals per tuple comparison and N log2 N
 
561
         * comparisons
 
562
         */
 
563
        startup_cost += 2.0 * cpu_operator_cost * tuples * LOG2(tuples);
 
564
 
 
565
        /* disk costs */
 
566
        if (nbytes > work_mem_bytes)
 
567
        {
 
568
                double          npages = ceil(nbytes / BLCKSZ);
 
569
                double          nruns = (nbytes / work_mem_bytes) * 0.5;
 
570
                double          log_runs = ceil(LOG6(nruns));
 
571
                double          npageaccesses;
 
572
 
 
573
                if (log_runs < 1.0)
 
574
                        log_runs = 1.0;
 
575
                npageaccesses = 2.0 * npages * log_runs;
 
576
                /* Assume half are sequential (cost 1), half are not */
 
577
                startup_cost += npageaccesses *
 
578
                        (1.0 + cost_nonsequential_access(npages)) * 0.5;
 
579
        }
 
580
 
 
581
        /*
 
582
         * Also charge a small amount (arbitrarily set equal to operator cost)
 
583
         * per extracted tuple.
 
584
         */
 
585
        run_cost += cpu_operator_cost * tuples;
 
586
 
 
587
        path->startup_cost = startup_cost;
 
588
        path->total_cost = startup_cost + run_cost;
 
589
}
 
590
 
 
591
/*
 
592
 * cost_material
 
593
 *        Determines and returns the cost of materializing a relation, including
 
594
 *        the cost of reading the input data.
 
595
 *
 
596
 * If the total volume of data to materialize exceeds work_mem, we will need
 
597
 * to write it to disk, so the cost is much higher in that case.
 
598
 */
 
599
void
 
600
cost_material(Path *path,
 
601
                          Cost input_cost, double tuples, int width)
 
602
{
 
603
        Cost            startup_cost = input_cost;
 
604
        Cost            run_cost = 0;
 
605
        double          nbytes = relation_byte_size(tuples, width);
 
606
        long            work_mem_bytes = work_mem * 1024L;
 
607
 
 
608
        /* disk costs */
 
609
        if (nbytes > work_mem_bytes)
 
610
        {
 
611
                double          npages = ceil(nbytes / BLCKSZ);
 
612
 
 
613
                /* We'll write during startup and read during retrieval */
 
614
                startup_cost += npages;
 
615
                run_cost += npages;
 
616
        }
 
617
 
 
618
        /*
 
619
         * Charge a very small amount per inserted tuple, to reflect bookkeeping
 
620
         * costs.  We use cpu_tuple_cost/10 for this.  This is needed to break
 
621
         * the tie that would otherwise exist between nestloop with A outer,
 
622
         * materialized B inner and nestloop with B outer, materialized A inner.
 
623
         * The extra cost ensures we'll prefer materializing the smaller rel.
 
624
         */
 
625
        startup_cost += cpu_tuple_cost * 0.1 * tuples;
 
626
 
 
627
        /*
 
628
         * Also charge a small amount per extracted tuple.      We use
 
629
         * cpu_tuple_cost so that it doesn't appear worthwhile to materialize
 
630
         * a bare seqscan.
 
631
         */
 
632
        run_cost += cpu_tuple_cost * tuples;
 
633
 
 
634
        path->startup_cost = startup_cost;
 
635
        path->total_cost = startup_cost + run_cost;
 
636
}
 
637
 
 
638
/*
 
639
 * cost_agg
 
640
 *              Determines and returns the cost of performing an Agg plan node,
 
641
 *              including the cost of its input.
 
642
 *
 
643
 * Note: when aggstrategy == AGG_SORTED, caller must ensure that input costs
 
644
 * are for appropriately-sorted input.
 
645
 */
 
646
void
 
647
cost_agg(Path *path, Query *root,
 
648
                 AggStrategy aggstrategy, int numAggs,
 
649
                 int numGroupCols, double numGroups,
 
650
                 Cost input_startup_cost, Cost input_total_cost,
 
651
                 double input_tuples)
 
652
{
 
653
        Cost            startup_cost;
 
654
        Cost            total_cost;
 
655
 
 
656
        /*
 
657
         * We charge one cpu_operator_cost per aggregate function per input
 
658
         * tuple, and another one per output tuple (corresponding to transfn
 
659
         * and finalfn calls respectively).  If we are grouping, we charge an
 
660
         * additional cpu_operator_cost per grouping column per input tuple
 
661
         * for grouping comparisons.
 
662
         *
 
663
         * We will produce a single output tuple if not grouping, and a tuple per
 
664
         * group otherwise.
 
665
         *
 
666
         * Note: in this cost model, AGG_SORTED and AGG_HASHED have exactly the
 
667
         * same total CPU cost, but AGG_SORTED has lower startup cost.  If the
 
668
         * input path is already sorted appropriately, AGG_SORTED should be
 
669
         * preferred (since it has no risk of memory overflow).  This will
 
670
         * happen as long as the computed total costs are indeed exactly equal
 
671
         * --- but if there's roundoff error we might do the wrong thing.  So
 
672
         * be sure that the computations below form the same intermediate
 
673
         * values in the same order.
 
674
         */
 
675
        if (aggstrategy == AGG_PLAIN)
 
676
        {
 
677
                startup_cost = input_total_cost;
 
678
                startup_cost += cpu_operator_cost * (input_tuples + 1) * numAggs;
 
679
                /* we aren't grouping */
 
680
                total_cost = startup_cost;
 
681
        }
 
682
        else if (aggstrategy == AGG_SORTED)
 
683
        {
 
684
                /* Here we are able to deliver output on-the-fly */
 
685
                startup_cost = input_startup_cost;
 
686
                total_cost = input_total_cost;
 
687
                /* calcs phrased this way to match HASHED case, see note above */
 
688
                total_cost += cpu_operator_cost * input_tuples * numGroupCols;
 
689
                total_cost += cpu_operator_cost * input_tuples * numAggs;
 
690
                total_cost += cpu_operator_cost * numGroups * numAggs;
 
691
        }
 
692
        else
 
693
        {
 
694
                /* must be AGG_HASHED */
 
695
                startup_cost = input_total_cost;
 
696
                startup_cost += cpu_operator_cost * input_tuples * numGroupCols;
 
697
                startup_cost += cpu_operator_cost * input_tuples * numAggs;
 
698
                total_cost = startup_cost;
 
699
                total_cost += cpu_operator_cost * numGroups * numAggs;
 
700
        }
 
701
 
 
702
        path->startup_cost = startup_cost;
 
703
        path->total_cost = total_cost;
 
704
}
 
705
 
 
706
/*
 
707
 * cost_group
 
708
 *              Determines and returns the cost of performing a Group plan node,
 
709
 *              including the cost of its input.
 
710
 *
 
711
 * Note: caller must ensure that input costs are for appropriately-sorted
 
712
 * input.
 
713
 */
 
714
void
 
715
cost_group(Path *path, Query *root,
 
716
                   int numGroupCols, double numGroups,
 
717
                   Cost input_startup_cost, Cost input_total_cost,
 
718
                   double input_tuples)
 
719
{
 
720
        Cost            startup_cost;
 
721
        Cost            total_cost;
 
722
 
 
723
        startup_cost = input_startup_cost;
 
724
        total_cost = input_total_cost;
 
725
 
 
726
        /*
 
727
         * Charge one cpu_operator_cost per comparison per input tuple. We
 
728
         * assume all columns get compared at most of the tuples.
 
729
         */
 
730
        total_cost += cpu_operator_cost * input_tuples * numGroupCols;
 
731
 
 
732
        path->startup_cost = startup_cost;
 
733
        path->total_cost = total_cost;
 
734
}
 
735
 
 
736
/*
 
737
 * cost_nestloop
 
738
 *        Determines and returns the cost of joining two relations using the
 
739
 *        nested loop algorithm.
 
740
 *
 
741
 * 'path' is already filled in except for the cost fields
 
742
 */
 
743
void
 
744
cost_nestloop(NestPath *path, Query *root)
 
745
{
 
746
        Path       *outer_path = path->outerjoinpath;
 
747
        Path       *inner_path = path->innerjoinpath;
 
748
        Cost            startup_cost = 0;
 
749
        Cost            run_cost = 0;
 
750
        Cost            cpu_per_tuple;
 
751
        QualCost        restrict_qual_cost;
 
752
        double          outer_path_rows = PATH_ROWS(outer_path);
 
753
        double          inner_path_rows = PATH_ROWS(inner_path);
 
754
        double          ntuples;
 
755
        Selectivity joininfactor;
 
756
 
 
757
        /*
 
758
         * If inner path is an indexscan, be sure to use its estimated output
 
759
         * row count, which may be lower than the restriction-clause-only row
 
760
         * count of its parent.  (We don't include this case in the PATH_ROWS
 
761
         * macro because it applies *only* to a nestloop's inner relation.)
 
762
         */
 
763
        if (IsA(inner_path, IndexPath))
 
764
                inner_path_rows = ((IndexPath *) inner_path)->rows;
 
765
 
 
766
        if (!enable_nestloop)
 
767
                startup_cost += disable_cost;
 
768
 
 
769
        /*
 
770
         * If we're doing JOIN_IN then we will stop scanning inner tuples for
 
771
         * an outer tuple as soon as we have one match.  Account for the
 
772
         * effects of this by scaling down the cost estimates in proportion to
 
773
         * the JOIN_IN selectivity.  (This assumes that all the quals attached
 
774
         * to the join are IN quals, which should be true.)
 
775
         */
 
776
        joininfactor = join_in_selectivity(path, root);
 
777
 
 
778
        /* cost of source data */
 
779
 
 
780
        /*
 
781
         * NOTE: clearly, we must pay both outer and inner paths' startup_cost
 
782
         * before we can start returning tuples, so the join's startup cost is
 
783
         * their sum.  What's not so clear is whether the inner path's
 
784
         * startup_cost must be paid again on each rescan of the inner path.
 
785
         * This is not true if the inner path is materialized or is a
 
786
         * hashjoin, but probably is true otherwise.
 
787
         */
 
788
        startup_cost += outer_path->startup_cost + inner_path->startup_cost;
 
789
        run_cost += outer_path->total_cost - outer_path->startup_cost;
 
790
        if (IsA(inner_path, MaterialPath) ||
 
791
                IsA(inner_path, HashPath))
 
792
        {
 
793
                /* charge only run cost for each iteration of inner path */
 
794
        }
 
795
        else
 
796
        {
 
797
                /*
 
798
                 * charge startup cost for each iteration of inner path, except we
 
799
                 * already charged the first startup_cost in our own startup
 
800
                 */
 
801
                run_cost += (outer_path_rows - 1) * inner_path->startup_cost;
 
802
        }
 
803
        run_cost += outer_path_rows *
 
804
                (inner_path->total_cost - inner_path->startup_cost) * joininfactor;
 
805
 
 
806
        /*
 
807
         * Compute number of tuples processed (not number emitted!)
 
808
         */
 
809
        ntuples = outer_path_rows * inner_path_rows * joininfactor;
 
810
 
 
811
        /* CPU costs */
 
812
        cost_qual_eval(&restrict_qual_cost, path->joinrestrictinfo);
 
813
        startup_cost += restrict_qual_cost.startup;
 
814
        cpu_per_tuple = cpu_tuple_cost + restrict_qual_cost.per_tuple;
 
815
        run_cost += cpu_per_tuple * ntuples;
 
816
 
 
817
        path->path.startup_cost = startup_cost;
 
818
        path->path.total_cost = startup_cost + run_cost;
 
819
}
 
820
 
 
821
/*
 
822
 * cost_mergejoin
 
823
 *        Determines and returns the cost of joining two relations using the
 
824
 *        merge join algorithm.
 
825
 *
 
826
 * 'path' is already filled in except for the cost fields
 
827
 *
 
828
 * Notes: path's mergeclauses should be a subset of the joinrestrictinfo list;
 
829
 * outersortkeys and innersortkeys are lists of the keys to be used
 
830
 * to sort the outer and inner relations, or NIL if no explicit
 
831
 * sort is needed because the source path is already ordered.
 
832
 */
 
833
void
 
834
cost_mergejoin(MergePath *path, Query *root)
 
835
{
 
836
        Path       *outer_path = path->jpath.outerjoinpath;
 
837
        Path       *inner_path = path->jpath.innerjoinpath;
 
838
        List       *mergeclauses = path->path_mergeclauses;
 
839
        List       *outersortkeys = path->outersortkeys;
 
840
        List       *innersortkeys = path->innersortkeys;
 
841
        Cost            startup_cost = 0;
 
842
        Cost            run_cost = 0;
 
843
        Cost            cpu_per_tuple;
 
844
        Selectivity merge_selec;
 
845
        QualCost        merge_qual_cost;
 
846
        QualCost        qp_qual_cost;
 
847
        RestrictInfo *firstclause;
 
848
        double          outer_path_rows = PATH_ROWS(outer_path);
 
849
        double          inner_path_rows = PATH_ROWS(inner_path);
 
850
        double          outer_rows,
 
851
                                inner_rows;
 
852
        double          mergejointuples,
 
853
                                rescannedtuples;
 
854
        double          rescanratio;
 
855
        Selectivity outerscansel,
 
856
                                innerscansel;
 
857
        Selectivity joininfactor;
 
858
        Path            sort_path;              /* dummy for result of cost_sort */
 
859
 
 
860
        if (!enable_mergejoin)
 
861
                startup_cost += disable_cost;
 
862
 
 
863
        /*
 
864
         * Compute cost and selectivity of the mergequals and qpquals (other
 
865
         * restriction clauses) separately.  We use approx_selectivity here
 
866
         * for speed --- in most cases, any errors won't affect the result
 
867
         * much.
 
868
         *
 
869
         * Note: it's probably bogus to use the normal selectivity calculation
 
870
         * here when either the outer or inner path is a UniquePath.
 
871
         */
 
872
        merge_selec = approx_selectivity(root, mergeclauses,
 
873
                                                                         path->jpath.jointype);
 
874
        cost_qual_eval(&merge_qual_cost, mergeclauses);
 
875
        cost_qual_eval(&qp_qual_cost, path->jpath.joinrestrictinfo);
 
876
        qp_qual_cost.startup -= merge_qual_cost.startup;
 
877
        qp_qual_cost.per_tuple -= merge_qual_cost.per_tuple;
 
878
 
 
879
        /* approx # tuples passing the merge quals */
 
880
        mergejointuples = clamp_row_est(merge_selec * outer_path_rows * inner_path_rows);
 
881
 
 
882
        /*
 
883
         * When there are equal merge keys in the outer relation, the
 
884
         * mergejoin must rescan any matching tuples in the inner relation.
 
885
         * This means re-fetching inner tuples.  Our cost model for this is
 
886
         * that a re-fetch costs the same as an original fetch, which is
 
887
         * probably an overestimate; but on the other hand we ignore the
 
888
         * bookkeeping costs of mark/restore. Not clear if it's worth
 
889
         * developing a more refined model.
 
890
         *
 
891
         * The number of re-fetches can be estimated approximately as size of
 
892
         * merge join output minus size of inner relation.      Assume that the
 
893
         * distinct key values are 1, 2, ..., and denote the number of values
 
894
         * of each key in the outer relation as m1, m2, ...; in the inner
 
895
         * relation, n1, n2, ...  Then we have
 
896
         *
 
897
         * size of join = m1 * n1 + m2 * n2 + ...
 
898
         *
 
899
         * number of rescanned tuples = (m1 - 1) * n1 + (m2 - 1) * n2 + ... = m1 *
 
900
         * n1 + m2 * n2 + ... - (n1 + n2 + ...) = size of join - size of inner
 
901
         * relation
 
902
         *
 
903
         * This equation works correctly for outer tuples having no inner match
 
904
         * (nk = 0), but not for inner tuples having no outer match (mk = 0);
 
905
         * we are effectively subtracting those from the number of rescanned
 
906
         * tuples, when we should not.  Can we do better without expensive
 
907
         * selectivity computations?
 
908
         */
 
909
        if (IsA(outer_path, UniquePath))
 
910
                rescannedtuples = 0;
 
911
        else
 
912
        {
 
913
                rescannedtuples = mergejointuples - inner_path_rows;
 
914
                /* Must clamp because of possible underestimate */
 
915
                if (rescannedtuples < 0)
 
916
                        rescannedtuples = 0;
 
917
        }
 
918
        /* We'll inflate inner run cost this much to account for rescanning */
 
919
        rescanratio = 1.0 + (rescannedtuples / inner_path_rows);
 
920
 
 
921
        /*
 
922
         * A merge join will stop as soon as it exhausts either input stream
 
923
         * (unless it's an outer join, in which case the outer side has to be
 
924
         * scanned all the way anyway).  Estimate fraction of the left and right
 
925
         * inputs that will actually need to be scanned. We use only the first
 
926
         * (most significant) merge clause for this purpose.
 
927
         *
 
928
         * Since this calculation is somewhat expensive, and will be the same for
 
929
         * all mergejoin paths associated with the merge clause, we cache the
 
930
         * results in the RestrictInfo node.
 
931
         */
 
932
        if (mergeclauses && path->jpath.jointype != JOIN_FULL)
 
933
        {
 
934
                firstclause = (RestrictInfo *) linitial(mergeclauses);
 
935
                if (firstclause->left_mergescansel < 0) /* not computed yet? */
 
936
                        mergejoinscansel(root, (Node *) firstclause->clause,
 
937
                                                         &firstclause->left_mergescansel,
 
938
                                                         &firstclause->right_mergescansel);
 
939
 
 
940
                if (bms_is_subset(firstclause->left_relids, outer_path->parent->relids))
 
941
                {
 
942
                        /* left side of clause is outer */
 
943
                        outerscansel = firstclause->left_mergescansel;
 
944
                        innerscansel = firstclause->right_mergescansel;
 
945
                }
 
946
                else
 
947
                {
 
948
                        /* left side of clause is inner */
 
949
                        outerscansel = firstclause->right_mergescansel;
 
950
                        innerscansel = firstclause->left_mergescansel;
 
951
                }
 
952
                if (path->jpath.jointype == JOIN_LEFT)
 
953
                        outerscansel = 1.0;
 
954
                else if (path->jpath.jointype == JOIN_RIGHT)
 
955
                        innerscansel = 1.0;
 
956
        }
 
957
        else
 
958
        {
 
959
                /* cope with clauseless or full mergejoin */
 
960
                outerscansel = innerscansel = 1.0;
 
961
        }
 
962
 
 
963
        /* convert selectivity to row count; must scan at least one row */
 
964
        outer_rows = clamp_row_est(outer_path_rows * outerscansel);
 
965
        inner_rows = clamp_row_est(inner_path_rows * innerscansel);
 
966
 
 
967
        /*
 
968
         * Readjust scan selectivities to account for above rounding.  This is
 
969
         * normally an insignificant effect, but when there are only a few
 
970
         * rows in the inputs, failing to do this makes for a large percentage
 
971
         * error.
 
972
         */
 
973
        outerscansel = outer_rows / outer_path_rows;
 
974
        innerscansel = inner_rows / inner_path_rows;
 
975
 
 
976
        /* cost of source data */
 
977
 
 
978
        if (outersortkeys)                      /* do we need to sort outer? */
 
979
        {
 
980
                cost_sort(&sort_path,
 
981
                                  root,
 
982
                                  outersortkeys,
 
983
                                  outer_path->total_cost,
 
984
                                  outer_path_rows,
 
985
                                  outer_path->parent->width);
 
986
                startup_cost += sort_path.startup_cost;
 
987
                run_cost += (sort_path.total_cost - sort_path.startup_cost)
 
988
                        * outerscansel;
 
989
        }
 
990
        else
 
991
        {
 
992
                startup_cost += outer_path->startup_cost;
 
993
                run_cost += (outer_path->total_cost - outer_path->startup_cost)
 
994
                        * outerscansel;
 
995
        }
 
996
 
 
997
        if (innersortkeys)                      /* do we need to sort inner? */
 
998
        {
 
999
                cost_sort(&sort_path,
 
1000
                                  root,
 
1001
                                  innersortkeys,
 
1002
                                  inner_path->total_cost,
 
1003
                                  inner_path_rows,
 
1004
                                  inner_path->parent->width);
 
1005
                startup_cost += sort_path.startup_cost;
 
1006
                run_cost += (sort_path.total_cost - sort_path.startup_cost)
 
1007
                        * innerscansel * rescanratio;
 
1008
        }
 
1009
        else
 
1010
        {
 
1011
                startup_cost += inner_path->startup_cost;
 
1012
                run_cost += (inner_path->total_cost - inner_path->startup_cost)
 
1013
                        * innerscansel * rescanratio;
 
1014
        }
 
1015
 
 
1016
        /* CPU costs */
 
1017
 
 
1018
        /*
 
1019
         * If we're doing JOIN_IN then we will stop outputting inner tuples
 
1020
         * for an outer tuple as soon as we have one match.  Account for the
 
1021
         * effects of this by scaling down the cost estimates in proportion to
 
1022
         * the expected output size.  (This assumes that all the quals
 
1023
         * attached to the join are IN quals, which should be true.)
 
1024
         */
 
1025
        joininfactor = join_in_selectivity(&path->jpath, root);
 
1026
 
 
1027
        /*
 
1028
         * The number of tuple comparisons needed is approximately number of
 
1029
         * outer rows plus number of inner rows plus number of rescanned
 
1030
         * tuples (can we refine this?).  At each one, we need to evaluate the
 
1031
         * mergejoin quals.  NOTE: JOIN_IN mode does not save any work here,
 
1032
         * so do NOT include joininfactor.
 
1033
         */
 
1034
        startup_cost += merge_qual_cost.startup;
 
1035
        run_cost += merge_qual_cost.per_tuple *
 
1036
                (outer_rows + inner_rows * rescanratio);
 
1037
 
 
1038
        /*
 
1039
         * For each tuple that gets through the mergejoin proper, we charge
 
1040
         * cpu_tuple_cost plus the cost of evaluating additional restriction
 
1041
         * clauses that are to be applied at the join.  (This is pessimistic
 
1042
         * since not all of the quals may get evaluated at each tuple.)  This
 
1043
         * work is skipped in JOIN_IN mode, so apply the factor.
 
1044
         */
 
1045
        startup_cost += qp_qual_cost.startup;
 
1046
        cpu_per_tuple = cpu_tuple_cost + qp_qual_cost.per_tuple;
 
1047
        run_cost += cpu_per_tuple * mergejointuples * joininfactor;
 
1048
 
 
1049
        path->jpath.path.startup_cost = startup_cost;
 
1050
        path->jpath.path.total_cost = startup_cost + run_cost;
 
1051
}
 
1052
 
 
1053
/*
 
1054
 * cost_hashjoin
 
1055
 *        Determines and returns the cost of joining two relations using the
 
1056
 *        hash join algorithm.
 
1057
 *
 
1058
 * 'path' is already filled in except for the cost fields
 
1059
 *
 
1060
 * Note: path's hashclauses should be a subset of the joinrestrictinfo list
 
1061
 */
 
1062
void
 
1063
cost_hashjoin(HashPath *path, Query *root)
 
1064
{
 
1065
        Path       *outer_path = path->jpath.outerjoinpath;
 
1066
        Path       *inner_path = path->jpath.innerjoinpath;
 
1067
        List       *hashclauses = path->path_hashclauses;
 
1068
        Cost            startup_cost = 0;
 
1069
        Cost            run_cost = 0;
 
1070
        Cost            cpu_per_tuple;
 
1071
        Selectivity hash_selec;
 
1072
        QualCost        hash_qual_cost;
 
1073
        QualCost        qp_qual_cost;
 
1074
        double          hashjointuples;
 
1075
        double          outer_path_rows = PATH_ROWS(outer_path);
 
1076
        double          inner_path_rows = PATH_ROWS(inner_path);
 
1077
        double          outerbytes = relation_byte_size(outer_path_rows,
 
1078
                                                                                          outer_path->parent->width);
 
1079
        double          innerbytes = relation_byte_size(inner_path_rows,
 
1080
                                                                                          inner_path->parent->width);
 
1081
        int                     num_hashclauses = list_length(hashclauses);
 
1082
        int                     virtualbuckets;
 
1083
        int                     physicalbuckets;
 
1084
        int                     numbatches;
 
1085
        Selectivity innerbucketsize;
 
1086
        Selectivity joininfactor;
 
1087
        ListCell   *hcl;
 
1088
 
 
1089
        if (!enable_hashjoin)
 
1090
                startup_cost += disable_cost;
 
1091
 
 
1092
        /*
 
1093
         * Compute cost and selectivity of the hashquals and qpquals (other
 
1094
         * restriction clauses) separately.  We use approx_selectivity here
 
1095
         * for speed --- in most cases, any errors won't affect the result
 
1096
         * much.
 
1097
         *
 
1098
         * Note: it's probably bogus to use the normal selectivity calculation
 
1099
         * here when either the outer or inner path is a UniquePath.
 
1100
         */
 
1101
        hash_selec = approx_selectivity(root, hashclauses,
 
1102
                                                                        path->jpath.jointype);
 
1103
        cost_qual_eval(&hash_qual_cost, hashclauses);
 
1104
        cost_qual_eval(&qp_qual_cost, path->jpath.joinrestrictinfo);
 
1105
        qp_qual_cost.startup -= hash_qual_cost.startup;
 
1106
        qp_qual_cost.per_tuple -= hash_qual_cost.per_tuple;
 
1107
 
 
1108
        /* approx # tuples passing the hash quals */
 
1109
        hashjointuples = clamp_row_est(hash_selec * outer_path_rows * inner_path_rows);
 
1110
 
 
1111
        /* cost of source data */
 
1112
        startup_cost += outer_path->startup_cost;
 
1113
        run_cost += outer_path->total_cost - outer_path->startup_cost;
 
1114
        startup_cost += inner_path->total_cost;
 
1115
 
 
1116
        /*
 
1117
         * Cost of computing hash function: must do it once per input tuple.
 
1118
         * We charge one cpu_operator_cost for each column's hash function.
 
1119
         *
 
1120
         * XXX when a hashclause is more complex than a single operator, we
 
1121
         * really should charge the extra eval costs of the left or right
 
1122
         * side, as appropriate, here.  This seems more work than it's worth
 
1123
         * at the moment.
 
1124
         */
 
1125
        startup_cost += cpu_operator_cost * num_hashclauses * inner_path_rows;
 
1126
        run_cost += cpu_operator_cost * num_hashclauses * outer_path_rows;
 
1127
 
 
1128
        /* Get hash table size that executor would use for inner relation */
 
1129
        ExecChooseHashTableSize(inner_path_rows,
 
1130
                                                        inner_path->parent->width,
 
1131
                                                        &virtualbuckets,
 
1132
                                                        &physicalbuckets,
 
1133
                                                        &numbatches);
 
1134
 
 
1135
        /*
 
1136
         * Determine bucketsize fraction for inner relation.  We use the
 
1137
         * smallest bucketsize estimated for any individual hashclause; this
 
1138
         * is undoubtedly conservative.
 
1139
         *
 
1140
         * BUT: if inner relation has been unique-ified, we can assume it's good
 
1141
         * for hashing.  This is important both because it's the right answer,
 
1142
         * and because we avoid contaminating the cache with a value that's
 
1143
         * wrong for non-unique-ified paths.
 
1144
         */
 
1145
        if (IsA(inner_path, UniquePath))
 
1146
                innerbucketsize = 1.0 / virtualbuckets;
 
1147
        else
 
1148
        {
 
1149
                innerbucketsize = 1.0;
 
1150
                foreach(hcl, hashclauses)
 
1151
                {
 
1152
                        RestrictInfo *restrictinfo = (RestrictInfo *) lfirst(hcl);
 
1153
                        Selectivity thisbucketsize;
 
1154
 
 
1155
                        Assert(IsA(restrictinfo, RestrictInfo));
 
1156
 
 
1157
                        /*
 
1158
                         * First we have to figure out which side of the hashjoin
 
1159
                         * clause is the inner side.
 
1160
                         *
 
1161
                         * Since we tend to visit the same clauses over and over when
 
1162
                         * planning a large query, we cache the bucketsize estimate in
 
1163
                         * the RestrictInfo node to avoid repeated lookups of
 
1164
                         * statistics.
 
1165
                         */
 
1166
                        if (bms_is_subset(restrictinfo->right_relids,
 
1167
                                                          inner_path->parent->relids))
 
1168
                        {
 
1169
                                /* righthand side is inner */
 
1170
                                thisbucketsize = restrictinfo->right_bucketsize;
 
1171
                                if (thisbucketsize < 0)
 
1172
                                {
 
1173
                                        /* not cached yet */
 
1174
                                        thisbucketsize =
 
1175
                                                estimate_hash_bucketsize(root,
 
1176
                                                                           get_rightop(restrictinfo->clause),
 
1177
                                                                                                 virtualbuckets);
 
1178
                                        restrictinfo->right_bucketsize = thisbucketsize;
 
1179
                                }
 
1180
                        }
 
1181
                        else
 
1182
                        {
 
1183
                                Assert(bms_is_subset(restrictinfo->left_relids,
 
1184
                                                                         inner_path->parent->relids));
 
1185
                                /* lefthand side is inner */
 
1186
                                thisbucketsize = restrictinfo->left_bucketsize;
 
1187
                                if (thisbucketsize < 0)
 
1188
                                {
 
1189
                                        /* not cached yet */
 
1190
                                        thisbucketsize =
 
1191
                                                estimate_hash_bucketsize(root,
 
1192
                                                                                get_leftop(restrictinfo->clause),
 
1193
                                                                                                 virtualbuckets);
 
1194
                                        restrictinfo->left_bucketsize = thisbucketsize;
 
1195
                                }
 
1196
                        }
 
1197
 
 
1198
                        if (innerbucketsize > thisbucketsize)
 
1199
                                innerbucketsize = thisbucketsize;
 
1200
                }
 
1201
        }
 
1202
 
 
1203
        /*
 
1204
         * if inner relation is too big then we will need to "batch" the join,
 
1205
         * which implies writing and reading most of the tuples to disk an
 
1206
         * extra time.  Charge one cost unit per page of I/O (correct since it
 
1207
         * should be nice and sequential...).  Writing the inner rel counts as
 
1208
         * startup cost, all the rest as run cost.
 
1209
         */
 
1210
        if (numbatches)
 
1211
        {
 
1212
                double          outerpages = page_size(outer_path_rows,
 
1213
                                                                                   outer_path->parent->width);
 
1214
                double          innerpages = page_size(inner_path_rows,
 
1215
                                                                                   inner_path->parent->width);
 
1216
 
 
1217
                startup_cost += innerpages;
 
1218
                run_cost += innerpages + 2 * outerpages;
 
1219
        }
 
1220
 
 
1221
        /* CPU costs */
 
1222
 
 
1223
        /*
 
1224
         * If we're doing JOIN_IN then we will stop comparing inner tuples to
 
1225
         * an outer tuple as soon as we have one match.  Account for the
 
1226
         * effects of this by scaling down the cost estimates in proportion to
 
1227
         * the expected output size.  (This assumes that all the quals
 
1228
         * attached to the join are IN quals, which should be true.)
 
1229
         */
 
1230
        joininfactor = join_in_selectivity(&path->jpath, root);
 
1231
 
 
1232
        /*
 
1233
         * The number of tuple comparisons needed is the number of outer
 
1234
         * tuples times the typical number of tuples in a hash bucket, which
 
1235
         * is the inner relation size times its bucketsize fraction.  At each
 
1236
         * one, we need to evaluate the hashjoin quals.
 
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
}