1 /*------------------------------------------------------------------------- 2 * 3 * cost.h 4 * prototypes for costsize.c and clausesel.c. 5 * 6 * 7 * Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group 8 * Portions Copyright (c) 1994, Regents of the University of California 9 * 10 * src/include/optimizer/cost.h 11 * 12 *------------------------------------------------------------------------- 13 */ 14 #ifndef COST_H 15 #define COST_H 16 17 #include "nodes/plannodes.h" 18 #include "nodes/relation.h" 19 20 21 /* defaults for costsize.c's Cost parameters */ 22 /* NB: cost-estimation code should use the variables, not these constants! */ 23 /* If you change these, update backend/utils/misc/postgresql.sample.conf */ 24 #define DEFAULT_SEQ_PAGE_COST 1.0 25 #define DEFAULT_RANDOM_PAGE_COST 4.0 26 #define DEFAULT_CPU_TUPLE_COST 0.01 27 #define DEFAULT_CPU_INDEX_TUPLE_COST 0.005 28 #define DEFAULT_CPU_OPERATOR_COST 0.0025 29 #define DEFAULT_PARALLEL_TUPLE_COST 0.1 30 #define DEFAULT_PARALLEL_SETUP_COST 1000.0 31 32 #define DEFAULT_EFFECTIVE_CACHE_SIZE 524288 /* measured in pages */ 33 34 typedef enum 35 { 36 CONSTRAINT_EXCLUSION_OFF, /* do not use c_e */ 37 CONSTRAINT_EXCLUSION_ON, /* apply c_e to all rels */ 38 CONSTRAINT_EXCLUSION_PARTITION /* apply c_e to otherrels only */ 39 } ConstraintExclusionType; 40 41 42 /* 43 * prototypes for costsize.c 44 * routines to compute costs and sizes 45 */ 46 47 /* parameter variables and flags */ 48 extern PGDLLIMPORT double seq_page_cost; 49 extern PGDLLIMPORT double random_page_cost; 50 extern PGDLLIMPORT double cpu_tuple_cost; 51 extern PGDLLIMPORT double cpu_index_tuple_cost; 52 extern PGDLLIMPORT double cpu_operator_cost; 53 extern PGDLLIMPORT double parallel_tuple_cost; 54 extern PGDLLIMPORT double parallel_setup_cost; 55 extern PGDLLIMPORT int effective_cache_size; 56 extern PGDLLIMPORT Cost disable_cost; 57 extern PGDLLIMPORT int max_parallel_workers_per_gather; 58 extern PGDLLIMPORT bool enable_seqscan; 59 extern PGDLLIMPORT bool enable_indexscan; 60 extern PGDLLIMPORT bool enable_indexonlyscan; 61 extern PGDLLIMPORT bool enable_bitmapscan; 62 extern PGDLLIMPORT bool enable_tidscan; 63 extern PGDLLIMPORT bool enable_sort; 64 extern PGDLLIMPORT bool enable_hashagg; 65 extern PGDLLIMPORT bool enable_nestloop; 66 extern PGDLLIMPORT bool enable_material; 67 extern PGDLLIMPORT bool enable_mergejoin; 68 extern PGDLLIMPORT bool enable_hashjoin; 69 extern PGDLLIMPORT bool enable_gathermerge; 70 extern PGDLLIMPORT bool enable_partitionwise_join; 71 extern PGDLLIMPORT bool enable_partitionwise_aggregate; 72 extern PGDLLIMPORT bool enable_parallel_append; 73 extern PGDLLIMPORT bool enable_parallel_hash; 74 extern PGDLLIMPORT bool enable_partition_pruning; 75 extern PGDLLIMPORT int constraint_exclusion; 76 77 extern double clamp_row_est(double nrows); 78 extern double index_pages_fetched(double tuples_fetched, BlockNumber pages, 79 double index_pages, PlannerInfo *root); 80 extern void cost_seqscan(Path *path, PlannerInfo *root, RelOptInfo *baserel, 81 ParamPathInfo *param_info); 82 extern void cost_samplescan(Path *path, PlannerInfo *root, RelOptInfo *baserel, 83 ParamPathInfo *param_info); 84 extern void cost_index(IndexPath *path, PlannerInfo *root, 85 double loop_count, bool partial_path); 86 extern void cost_bitmap_heap_scan(Path *path, PlannerInfo *root, RelOptInfo *baserel, 87 ParamPathInfo *param_info, 88 Path *bitmapqual, double loop_count); 89 extern void cost_bitmap_and_node(BitmapAndPath *path, PlannerInfo *root); 90 extern void cost_bitmap_or_node(BitmapOrPath *path, PlannerInfo *root); 91 extern void cost_bitmap_tree_node(Path *path, Cost *cost, Selectivity *selec); 92 extern void cost_tidscan(Path *path, PlannerInfo *root, 93 RelOptInfo *baserel, List *tidquals, ParamPathInfo *param_info); 94 extern void cost_subqueryscan(SubqueryScanPath *path, PlannerInfo *root, 95 RelOptInfo *baserel, ParamPathInfo *param_info); 96 extern void cost_functionscan(Path *path, PlannerInfo *root, 97 RelOptInfo *baserel, ParamPathInfo *param_info); 98 extern void cost_tableexprscan(Path *path, PlannerInfo *root, 99 RelOptInfo *baserel, ParamPathInfo *param_info); 100 extern void cost_valuesscan(Path *path, PlannerInfo *root, 101 RelOptInfo *baserel, ParamPathInfo *param_info); 102 extern void cost_tablefuncscan(Path *path, PlannerInfo *root, 103 RelOptInfo *baserel, ParamPathInfo *param_info); 104 extern void cost_ctescan(Path *path, PlannerInfo *root, 105 RelOptInfo *baserel, ParamPathInfo *param_info); 106 extern void cost_namedtuplestorescan(Path *path, PlannerInfo *root, 107 RelOptInfo *baserel, ParamPathInfo *param_info); 108 extern void cost_recursive_union(Path *runion, Path *nrterm, Path *rterm); 109 extern void cost_sort(Path *path, PlannerInfo *root, 110 List *pathkeys, Cost input_cost, double tuples, int width, 111 Cost comparison_cost, int sort_mem, 112 double limit_tuples); 113 extern void cost_append(AppendPath *path); 114 extern void cost_merge_append(Path *path, PlannerInfo *root, 115 List *pathkeys, int n_streams, 116 Cost input_startup_cost, Cost input_total_cost, 117 double tuples); 118 extern void cost_material(Path *path, 119 Cost input_startup_cost, Cost input_total_cost, 120 double tuples, int width); 121 extern void cost_agg(Path *path, PlannerInfo *root, 122 AggStrategy aggstrategy, const AggClauseCosts *aggcosts, 123 int numGroupCols, double numGroups, 124 List *quals, 125 Cost input_startup_cost, Cost input_total_cost, 126 double input_tuples); 127 extern void cost_windowagg(Path *path, PlannerInfo *root, 128 List *windowFuncs, int numPartCols, int numOrderCols, 129 Cost input_startup_cost, Cost input_total_cost, 130 double input_tuples); 131 extern void cost_group(Path *path, PlannerInfo *root, 132 int numGroupCols, double numGroups, 133 List *quals, 134 Cost input_startup_cost, Cost input_total_cost, 135 double input_tuples); 136 extern void initial_cost_nestloop(PlannerInfo *root, 137 JoinCostWorkspace *workspace, 138 JoinType jointype, 139 Path *outer_path, Path *inner_path, 140 JoinPathExtraData *extra); 141 extern void final_cost_nestloop(PlannerInfo *root, NestPath *path, 142 JoinCostWorkspace *workspace, 143 JoinPathExtraData *extra); 144 extern void initial_cost_mergejoin(PlannerInfo *root, 145 JoinCostWorkspace *workspace, 146 JoinType jointype, 147 List *mergeclauses, 148 Path *outer_path, Path *inner_path, 149 List *outersortkeys, List *innersortkeys, 150 JoinPathExtraData *extra); 151 extern void final_cost_mergejoin(PlannerInfo *root, MergePath *path, 152 JoinCostWorkspace *workspace, 153 JoinPathExtraData *extra); 154 extern void initial_cost_hashjoin(PlannerInfo *root, 155 JoinCostWorkspace *workspace, 156 JoinType jointype, 157 List *hashclauses, 158 Path *outer_path, Path *inner_path, 159 JoinPathExtraData *extra, 160 bool parallel_hash); 161 extern void final_cost_hashjoin(PlannerInfo *root, HashPath *path, 162 JoinCostWorkspace *workspace, 163 JoinPathExtraData *extra); 164 extern void cost_gather(GatherPath *path, PlannerInfo *root, 165 RelOptInfo *baserel, ParamPathInfo *param_info, double *rows); 166 extern void cost_subplan(PlannerInfo *root, SubPlan *subplan, Plan *plan); 167 extern void cost_qual_eval(QualCost *cost, List *quals, PlannerInfo *root); 168 extern void cost_qual_eval_node(QualCost *cost, Node *qual, PlannerInfo *root); 169 extern void compute_semi_anti_join_factors(PlannerInfo *root, 170 RelOptInfo *joinrel, 171 RelOptInfo *outerrel, 172 RelOptInfo *innerrel, 173 JoinType jointype, 174 SpecialJoinInfo *sjinfo, 175 List *restrictlist, 176 SemiAntiJoinFactors *semifactors); 177 extern void set_baserel_size_estimates(PlannerInfo *root, RelOptInfo *rel); 178 extern double get_parameterized_baserel_size(PlannerInfo *root, 179 RelOptInfo *rel, 180 List *param_clauses); 181 extern double get_parameterized_joinrel_size(PlannerInfo *root, 182 RelOptInfo *rel, 183 Path *outer_path, 184 Path *inner_path, 185 SpecialJoinInfo *sjinfo, 186 List *restrict_clauses); 187 extern void set_joinrel_size_estimates(PlannerInfo *root, RelOptInfo *rel, 188 RelOptInfo *outer_rel, 189 RelOptInfo *inner_rel, 190 SpecialJoinInfo *sjinfo, 191 List *restrictlist); 192 extern void set_subquery_size_estimates(PlannerInfo *root, RelOptInfo *rel); 193 extern void set_function_size_estimates(PlannerInfo *root, RelOptInfo *rel); 194 extern void set_values_size_estimates(PlannerInfo *root, RelOptInfo *rel); 195 extern void set_cte_size_estimates(PlannerInfo *root, RelOptInfo *rel, 196 double cte_rows); 197 extern void set_tablefunc_size_estimates(PlannerInfo *root, RelOptInfo *rel); 198 extern void set_namedtuplestore_size_estimates(PlannerInfo *root, RelOptInfo *rel); 199 extern void set_foreign_size_estimates(PlannerInfo *root, RelOptInfo *rel); 200 extern PathTarget *set_pathtarget_cost_width(PlannerInfo *root, PathTarget *target); 201 extern double compute_bitmap_pages(PlannerInfo *root, RelOptInfo *baserel, 202 Path *bitmapqual, int loop_count, Cost *cost, double *tuple); 203 204 /* 205 * prototypes for clausesel.c 206 * routines to compute clause selectivities 207 */ 208 extern Selectivity clauselist_selectivity(PlannerInfo *root, 209 List *clauses, 210 int varRelid, 211 JoinType jointype, 212 SpecialJoinInfo *sjinfo); 213 extern Selectivity clause_selectivity(PlannerInfo *root, 214 Node *clause, 215 int varRelid, 216 JoinType jointype, 217 SpecialJoinInfo *sjinfo); 218 extern void cost_gather_merge(GatherMergePath *path, PlannerInfo *root, 219 RelOptInfo *rel, ParamPathInfo *param_info, 220 Cost input_startup_cost, Cost input_total_cost, 221 double *rows); 222 223 #endif /* COST_H */ 224