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