diff options
Diffstat (limited to 'src/backend')
| -rw-r--r-- | src/backend/optimizer/path/costsize.c | 5 | ||||
| -rw-r--r-- | src/backend/utils/adt/selfuncs.c | 14 |
2 files changed, 16 insertions, 3 deletions
diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index a39cc793b4d..54931cd6e2a 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -4360,7 +4360,7 @@ final_cost_hashjoin(PlannerInfo *root, HashPath *path, path->jpath.jointype)) { innerbucketsize = 1.0 / virtualbuckets; - innermcvfreq = 0.0; + innermcvfreq = 1.0 / inner_path_rows_total; } else { @@ -4428,7 +4428,8 @@ final_cost_hashjoin(PlannerInfo *root, HashPath *path, if (innerbucketsize > thisbucketsize) innerbucketsize = thisbucketsize; - if (innermcvfreq > thismcvfreq) + /* Disregard zero for MCV freq, it means we have no data */ + if (thismcvfreq > 0.0 && innermcvfreq > thismcvfreq) innermcvfreq = thismcvfreq; } } diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index b0f9b2da3d2..a996f0c4939 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -4401,9 +4401,10 @@ estimate_hash_bucket_stats(PlannerInfo *root, Node *hashkey, double nbuckets, examine_variable(root, hashkey, 0, &vardata); - /* Look up the frequency of the most common value, if available */ + /* Initialize *mcv_freq to "unknown" */ *mcv_freq = 0.0; + /* Look up the frequency of the most common value, if available */ if (HeapTupleIsValid(vardata.statsTuple)) { if (get_attstatsslot(&sslot, vardata.statsTuple, @@ -4417,6 +4418,17 @@ estimate_hash_bucket_stats(PlannerInfo *root, Node *hashkey, double nbuckets, *mcv_freq = sslot.numbers[0]; free_attstatsslot(&sslot); } + else if (get_attstatsslot(&sslot, vardata.statsTuple, + STATISTIC_KIND_HISTOGRAM, InvalidOid, + 0)) + { + /* + * If there are no recorded MCVs, but we do have a histogram, then + * assume that ANALYZE determined that the column is unique. + */ + if (vardata.rel && vardata.rel->rows > 0) + *mcv_freq = 1.0 / vardata.rel->rows; + } } /* Get number of distinct values */ |
