mirror of
https://github.com/postgres/postgres.git
synced 2025-04-22 23:02:54 +03:00
For a unique-key attribute (no duplicate values), vacuum analyze
was recording a disbursion of 0, not the correct value 1/numberOfRows.
This commit is contained in:
parent
a76ad509fe
commit
fb491a5854
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.116 1999/08/01 04:54:24 tgl Exp $
|
* $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.117 1999/08/08 17:13:10 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -2339,19 +2339,27 @@ vc_updstats(Oid relid, int num_pages, int num_tuples, bool hasindex, VRelStats *
|
|||||||
/* overwrite the existing statistics in the tuple */
|
/* overwrite the existing statistics in the tuple */
|
||||||
if (VacAttrStatsEqValid(stats))
|
if (VacAttrStatsEqValid(stats))
|
||||||
{
|
{
|
||||||
if (stats->nonnull_cnt + stats->null_cnt == 0 ||
|
if (stats->nonnull_cnt == 0 && stats->null_cnt == 0)
|
||||||
(stats->null_cnt <= 1 && stats->best_cnt == 1))
|
{
|
||||||
|
/* empty relation, so put a dummy value in attdisbursion */
|
||||||
selratio = 0;
|
selratio = 0;
|
||||||
|
}
|
||||||
|
else if (stats->null_cnt <= 1 && stats->best_cnt == 1)
|
||||||
|
{
|
||||||
|
/* looks like we have a unique-key attribute */
|
||||||
|
double total = ((double) stats->nonnull_cnt) + ((double) stats->null_cnt);
|
||||||
|
|
||||||
|
selratio = 1.0 / total;
|
||||||
|
}
|
||||||
else if (VacAttrStatsLtGtValid(stats) && stats->min_cnt + stats->max_cnt == stats->nonnull_cnt)
|
else if (VacAttrStatsLtGtValid(stats) && stats->min_cnt + stats->max_cnt == stats->nonnull_cnt)
|
||||||
{
|
{
|
||||||
/* exact result when there are just 1 or 2 values... */
|
/* exact result when there are just 1 or 2 values... */
|
||||||
double min_cnt_d = stats->min_cnt,
|
double min_cnt_d = stats->min_cnt,
|
||||||
max_cnt_d = stats->max_cnt,
|
max_cnt_d = stats->max_cnt,
|
||||||
null_cnt_d = stats->null_cnt,
|
null_cnt_d = stats->null_cnt;
|
||||||
nonnull_cnt_d = stats->nonnull_cnt; /* prevent overflow */
|
double total = ((double) stats->nonnull_cnt) + null_cnt_d;
|
||||||
|
|
||||||
selratio = (min_cnt_d * min_cnt_d + max_cnt_d * max_cnt_d + null_cnt_d * null_cnt_d) /
|
selratio = (min_cnt_d * min_cnt_d + max_cnt_d * max_cnt_d + null_cnt_d * null_cnt_d) / (total * total);
|
||||||
(nonnull_cnt_d + null_cnt_d) / (nonnull_cnt_d + null_cnt_d);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -2362,7 +2370,7 @@ vc_updstats(Oid relid, int num_pages, int num_tuples, bool hasindex, VRelStats *
|
|||||||
* we assume count of other values are 20% of best
|
* we assume count of other values are 20% of best
|
||||||
* count in table
|
* count in table
|
||||||
*/
|
*/
|
||||||
selratio = (most * most + 0.20 * most * (total - most)) / total / total;
|
selratio = (most * most + 0.20 * most * (total - most)) / (total * total);
|
||||||
}
|
}
|
||||||
if (selratio < 0.0)
|
if (selratio < 0.0)
|
||||||
selratio = 0.0;
|
selratio = 0.0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user