diff options
Diffstat (limited to 'src/backend/utils/adt/selfuncs.c')
-rw-r--r-- | src/backend/utils/adt/selfuncs.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index 2c993148271..9c7ffbf6bfb 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -4383,12 +4383,14 @@ double get_variable_numdistinct(VariableStatData *vardata) { double stadistinct; + double stanullfrac = 0.0; double ntuples; /* * Determine the stadistinct value to use. There are cases where we can * get an estimate even without a pg_statistic entry, or can get a better - * value than is in pg_statistic. + * value than is in pg_statistic. Grab stanullfrac too if we can find it + * (otherwise, assume no nulls, for lack of any better idea). */ if (HeapTupleIsValid(vardata->statsTuple)) { @@ -4397,6 +4399,7 @@ get_variable_numdistinct(VariableStatData *vardata) stats = (Form_pg_statistic) GETSTRUCT(vardata->statsTuple); stadistinct = stats->stadistinct; + stanullfrac = stats->stanullfrac; } else if (vardata->vartype == BOOLOID) { @@ -4420,7 +4423,7 @@ get_variable_numdistinct(VariableStatData *vardata) { case ObjectIdAttributeNumber: case SelfItemPointerAttributeNumber: - stadistinct = -1.0; /* unique */ + stadistinct = -1.0; /* unique (and all non null) */ break; case TableOidAttributeNumber: stadistinct = 1.0; /* only 1 value */ @@ -4442,10 +4445,11 @@ get_variable_numdistinct(VariableStatData *vardata) * If there is a unique index for the variable, assume it is unique no * matter what pg_statistic says; the statistics could be out of date, or * we might have found a partial unique index that proves the var is - * unique for this query. + * unique for this query. However, we'd better still believe + * the null-fraction statistic. */ if (vardata->isunique) - stadistinct = -1.0; + stadistinct = -1.0 * (1.0 - stanullfrac); /* * If we had an absolute estimate, use that. |