Add a little more smarts to estimate_hash_bucketsize(): if there's no
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 5 Oct 2003 22:44:25 +0000 (22:44 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 5 Oct 2003 22:44:25 +0000 (22:44 +0000)
statistics, but there is a unique index on the column, we can safely
assume it's well-distributed.

src/backend/optimizer/path/costsize.c

index 6b0179c8539e221e7289bfa806682018b7ad71bb..65eed58c9fb05c252be14cf366b41088476d74f6 100644 (file)
@@ -49,7 +49,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/optimizer/path/costsize.c,v 1.114 2003/08/08 21:41:44 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/optimizer/path/costsize.c,v 1.115 2003/10/05 22:44:25 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -64,6 +64,7 @@
 #include "optimizer/clauses.h"
 #include "optimizer/cost.h"
 #include "optimizer/pathnode.h"
+#include "optimizer/plancat.h"
 #include "parser/parsetree.h"
 #include "utils/selfuncs.h"
 #include "utils/lsyscache.h"
@@ -1343,6 +1344,13 @@ estimate_hash_bucketsize(Query *root, Var *var, int nbuckets)
                                                   0, 0);
        if (!HeapTupleIsValid(tuple))
        {
+               /*
+                * If the attribute is known unique because of an index,
+                * we can treat it as well-distributed.
+                */
+               if (has_unique_index(rel, var->varattno))
+                       return 1.0 / (double) nbuckets;
+
                /*
                 * Perhaps the Var is a system attribute; if so, it will have no
                 * entry in pg_statistic, but we may be able to guess something