diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index faebfeddb2..28322cec0e 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -79,6 +79,7 @@ static List *get_relation_statistics(RelOptInfo *rel, Relation relation); * min_attr lowest valid AttrNumber * max_attr highest valid AttrNumber * indexlist list of IndexOptInfos for relation's indexes + * statlist list of StatisticExtInfo for relation's statistic objects * serverid if it's a foreign table, the server OID * fdwroutine if it's a foreign table, the FDW function pointers * pages number of pages diff --git a/src/backend/statistics/dependencies.c b/src/backend/statistics/dependencies.c index fb958e1b0a..159ddb8723 100644 --- a/src/backend/statistics/dependencies.c +++ b/src/backend/statistics/dependencies.c @@ -900,7 +900,13 @@ find_strongest_dependency(StatisticExtInfo * stats, MVDependencies * dependencie /* * dependencies_clauselist_selectivity - * Attempt to estimate selectivity using functional dependency statistics + * Return the estimated selectivity of the given clauses using + * functional dependency statistics, or 1.0 if no useful functional + * dependency statistic exists. + * + * 'estimatedclauses' is an output argument that gets a bit set corresponding + * to the (zero-based) list index of clauses that are included in the + * estimated selectivity. * * Given equality clauses on attributes (a,b) we find the strongest dependency * between them, i.e. either (a=>b) or (b=>a). Assuming (a=>b) is the selected @@ -935,7 +941,6 @@ dependencies_clauselist_selectivity(PlannerInfo *root, AttrNumber *list_attnums; int listidx; - /* check if there's any stats that might be useful for us. */ if (!has_stats_of_kind(rel->statlist, STATS_EXT_DEPENDENCIES)) return 1.0; diff --git a/src/backend/statistics/extended_stats.c b/src/backend/statistics/extended_stats.c index 006bb897c4..4b3aa77814 100644 --- a/src/backend/statistics/extended_stats.c +++ b/src/backend/statistics/extended_stats.c @@ -408,7 +408,7 @@ multi_sort_compare_dims(int start, int end, /* * has_stats_of_kind - * Check that the list contains statistic of a given kind + * Check that the list contains statistic of a given kind */ bool has_stats_of_kind(List *stats, char requiredkind) @@ -428,8 +428,9 @@ has_stats_of_kind(List *stats, char requiredkind) /* * choose_best_statistics - * Look for statistics with the specified 'requiredkind' which have keys - * that match at least two attnums. + * Look for and return statistics with the specified 'requiredkind' which + * have keys that match at least two of the given attnums. Return NULL if + * there's no match. * * The current selection criteria is very simple - we choose the statistics * referencing the most attributes with the least keys. diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 24ffea8f40..ddb948528b 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -4508,7 +4508,6 @@ RelationGetStatExtList(Relation relation) NULL, 1, &skey); while (HeapTupleIsValid(htup = systable_getnext(indscan))) - /* TODO maybe include only already built statistics? */ result = insert_ordered_oid(result, HeapTupleGetOid(htup)); systable_endscan(indscan); diff --git a/src/include/nodes/relation.h b/src/include/nodes/relation.h index fc53eb171a..6bad18e77c 100644 --- a/src/include/nodes/relation.h +++ b/src/include/nodes/relation.h @@ -693,17 +693,15 @@ typedef struct ForeignKeyOptInfo * StatisticExtInfo * Information about extended statistics for planning/optimization * - * This contains information about which columns are covered by the - * statistics (stakeys), which options were requested while adding the - * statistics (*_enabled), and which kinds of statistics were actually - * built and are available for the optimizer (*_built). + * Each pg_statistic_ext row is represented by one or more nodes of this + * type, or even zero if ANALYZE has not computed them. */ typedef struct StatisticExtInfo { NodeTag type; Oid statOid; /* OID of the statistics row */ - RelOptInfo *rel; /* back-link to index's table */ + RelOptInfo *rel; /* back-link to statistic's table */ char kind; /* statistic kind of this entry */ Bitmapset *keys; /* attnums of the columns covered */ } StatisticExtInfo;