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 */
26typedef 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 */
33typedef 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 */
49typedef 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
56typedef 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 */
77typedef 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 */
86typedef 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
96extern MVNDistinct *statext_ndistinct_load(Oid mvoid);
97extern MVDependencies *statext_dependencies_load(Oid mvoid);
98extern MCVList *statext_mcv_load(Oid mvoid);
99
100extern void BuildRelationExtStatistics(Relation onerel, double totalrows,
101 int numrows, HeapTuple *rows,
102 int natts, VacAttrStats **vacattrstats);
103extern bool statext_is_kind_built(HeapTuple htup, char kind);
104extern Selectivity dependencies_clauselist_selectivity(PlannerInfo *root,
105 List *clauses,
106 int varRelid,
107 JoinType jointype,
108 SpecialJoinInfo *sjinfo,
109 RelOptInfo *rel,
110 Bitmapset **estimatedclauses);
111extern Selectivity statext_clauselist_selectivity(PlannerInfo *root,
112 List *clauses,
113 int varRelid,
114 JoinType jointype,
115 SpecialJoinInfo *sjinfo,
116 RelOptInfo *rel,
117 Bitmapset **estimatedclauses);
118extern bool has_stats_of_kind(List *stats, char requiredkind);
119extern StatisticExtInfo *choose_best_statistics(List *stats,
120 Bitmapset *attnums, char requiredkind);
121
122#endif /* STATISTICS_H */
123