]> granicus.if.org Git - postgresql/commitdiff
For a unique-key attribute (no duplicate values), vacuum analyze
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 8 Aug 1999 17:13:10 +0000 (17:13 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 8 Aug 1999 17:13:10 +0000 (17:13 +0000)
was recording a disbursion of 0, not the correct value 1/numberOfRows.

src/backend/commands/vacuum.c

index 12d2bc9bf99b856d2308f842562dcb61bb07adfc..0418a8d3a3891e85c2bc03cc8d74c9ceba1aad1d 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * 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 */
                        if (VacAttrStatsEqValid(stats))
                        {
-                               if (stats->nonnull_cnt + stats->null_cnt == 0 ||
-                                       (stats->null_cnt <= 1 && stats->best_cnt == 1))
+                               if (stats->nonnull_cnt == 0 && stats->null_cnt == 0)
+                               {
+                                       /* empty relation, so put a dummy value in attdisbursion */
                                        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)
                                {
                                        /* exact result when there are just 1 or 2 values... */
                                        double          min_cnt_d = stats->min_cnt,
                                                                max_cnt_d = stats->max_cnt,
-                                                               null_cnt_d = stats->null_cnt,
-                                                               nonnull_cnt_d = stats->nonnull_cnt;             /* prevent overflow */
+                                                               null_cnt_d = stats->null_cnt;
+                                       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) /
-                                               (nonnull_cnt_d + null_cnt_d) / (nonnull_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);
                                }
                                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
                                         * 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)
                                        selratio = 0.0;