1 /*------------------------------------------------------------------------- 2 * 3 * statistics.h 4 * Extended statistics and selectivity estimation functions. 5 * 6 * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group 7 * Portions Copyright (c) 1994, Regents of the University of California 8 * 9 * src/include/statistics/statistics.h 10 * 11 *------------------------------------------------------------------------- 12 */ 13 #ifndef STATISTICS_H 14 #define STATISTICS_H 15 16 #include "commands/vacuum.h" 17 #include "nodes/pathnodes.h" 18 19 #define STATS_MAX_DIMENSIONS 8 /* max number of attributes */ 20 21 /* Multivariate distinct coefficients */ 22 #define STATS_NDISTINCT_MAGIC 0xA352BFA4 /* struct identifier */ 23 #define STATS_NDISTINCT_TYPE_BASIC 1 /* struct version */ 24 25 /* MVNDistinctItem represents a single combination of columns */ 26 typedef struct MVNDistinctItem 27 { 28 double ndistinct; /* ndistinct value for this combination */ 29 int nattributes; /* number of attributes */ 30 AttrNumber *attributes; /* attribute numbers */ 31 } MVNDistinctItem; 32 33 /* A MVNDistinct object, comprising all possible combinations of columns */ 34 typedef struct MVNDistinct 35 { 36 uint32 magic; /* magic constant marker */ 37 uint32 type; /* type of ndistinct (BASIC) */ 38 uint32 nitems; /* number of items in the statistic */ 39 MVNDistinctItem items[FLEXIBLE_ARRAY_MEMBER]; 40 } MVNDistinct; 41 42 /* Multivariate functional dependencies */ 43 #define STATS_DEPS_MAGIC 0xB4549A2C /* marks serialized bytea */ 44 #define STATS_DEPS_TYPE_BASIC 1 /* basic dependencies type */ 45 46 /* 47 * Functional dependencies, tracking column-level relationships (values 48 * in one column determine values in another one). 49 */ 50 typedef struct MVDependency 51 { 52 double degree; /* degree of validity (0-1) */ 53 AttrNumber nattributes; /* number of attributes */ 54 AttrNumber attributes[FLEXIBLE_ARRAY_MEMBER]; /* attribute numbers */ 55 } MVDependency; 56 57 typedef struct MVDependencies 58 { 59 uint32 magic; /* magic constant marker */ 60 uint32 type; /* type of MV Dependencies (BASIC) */ 61 uint32 ndeps; /* number of dependencies */ 62 MVDependency *deps[FLEXIBLE_ARRAY_MEMBER]; /* dependencies */ 63 } MVDependencies; 64 65 /* used to flag stats serialized to bytea */ 66 #define STATS_MCV_MAGIC 0xE1A651C2 /* marks serialized bytea */ 67 #define STATS_MCV_TYPE_BASIC 1 /* basic MCV list type */ 68 69 /* max items in MCV list (should be equal to max default_statistics_target) */ 70 #define STATS_MCVLIST_MAX_ITEMS 10000 71 72 /* 73 * Multivariate MCV (most-common value) lists 74 * 75 * A straightforward extension of MCV items - i.e. a list (array) of 76 * combinations of attribute values, together with a frequency and null flags. 77 */ 78 typedef struct MCVItem 79 { 80 double frequency; /* frequency of this combination */ 81 double base_frequency; /* frequency if independent */ 82 bool *isnull; /* NULL flags */ 83 Datum *values; /* item values */ 84 } MCVItem; 85 86 /* multivariate MCV list - essentially an array of MCV items */ 87 typedef struct MCVList 88 { 89 uint32 magic; /* magic constant marker */ 90 uint32 type; /* type of MCV list (BASIC) */ 91 uint32 nitems; /* number of MCV items in the array */ 92 AttrNumber ndimensions; /* number of dimensions */ 93 Oid types[STATS_MAX_DIMENSIONS]; /* OIDs of data types */ 94 MCVItem items[FLEXIBLE_ARRAY_MEMBER]; /* array of MCV items */ 95 } MCVList; 96 97 extern MVNDistinct *statext_ndistinct_load(Oid mvoid); 98 extern MVDependencies *statext_dependencies_load(Oid mvoid); 99 extern MCVList *statext_mcv_load(Oid mvoid); 100 101 extern void BuildRelationExtStatistics(Relation onerel, double totalrows, 102 int numrows, HeapTuple *rows, 103 int natts, VacAttrStats **vacattrstats); 104 extern int ComputeExtStatisticsRows(Relation onerel, 105 int natts, VacAttrStats **stats); 106 extern bool statext_is_kind_built(HeapTuple htup, char kind); 107 extern Selectivity dependencies_clauselist_selectivity(PlannerInfo *root, 108 List *clauses, 109 int varRelid, 110 JoinType jointype, 111 SpecialJoinInfo *sjinfo, 112 RelOptInfo *rel, 113 Bitmapset **estimatedclauses); 114 extern Selectivity statext_clauselist_selectivity(PlannerInfo *root, 115 List *clauses, 116 int varRelid, 117 JoinType jointype, 118 SpecialJoinInfo *sjinfo, 119 RelOptInfo *rel, 120 Bitmapset **estimatedclauses, 121 bool is_or); 122 extern bool has_stats_of_kind(List *stats, char requiredkind); 123 extern StatisticExtInfo *choose_best_statistics(List *stats, char requiredkind, 124 Bitmapset **clause_attnums, 125 List **clause_exprs, 126 int nclauses); 127 extern HeapTuple statext_expressions_load(Oid stxoid, int idx); 128 129 #endif /* STATISTICS_H */ 130