Commit 40608e7f authored by Tom Lane's avatar Tom Lane

When estimating the selectivity of an inequality "column > constant" or

"column < constant", and the comparison value is in the first or last
histogram bin or outside the histogram entirely, try to fetch the actual
column min or max value using an index scan (if there is an index on the
column).  If successful, replace the lower or upper histogram bound with
that value before carrying on with the estimate.  This limits the
estimation error caused by moving min/max values when the comparison
value is close to the min or max.  Per a complaint from Josh Berkus.

It is tempting to consider using this mechanism for mergejoinscansel as well,
but that would inject index fetches into main-line join estimation not just
endpoint cases.  I'm refraining from that until we can get a better handle
on the costs of doing this type of lookup.
parent 89a091ed
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/executor/nodeHash.c,v 1.125 2010/01/02 16:57:41 momjian Exp $ * $PostgreSQL: pgsql/src/backend/executor/nodeHash.c,v 1.126 2010/01/04 02:44:39 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -1006,6 +1006,7 @@ ExecHashBuildSkewHash(HashJoinTable hashtable, Hash *node, int mcvsToUse) ...@@ -1006,6 +1006,7 @@ ExecHashBuildSkewHash(HashJoinTable hashtable, Hash *node, int mcvsToUse)
if (get_attstatsslot(statsTuple, node->skewColType, node->skewColTypmod, if (get_attstatsslot(statsTuple, node->skewColType, node->skewColTypmod,
STATISTIC_KIND_MCV, InvalidOid, STATISTIC_KIND_MCV, InvalidOid,
NULL,
&values, &nvalues, &values, &nvalues,
&numbers, &nnumbers)) &numbers, &nnumbers))
{ {
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/tsearch/ts_selfuncs.c,v 1.6 2010/01/02 16:57:53 momjian Exp $ * $PostgreSQL: pgsql/src/backend/tsearch/ts_selfuncs.c,v 1.7 2010/01/04 02:44:39 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -170,6 +170,7 @@ tsquerysel(VariableStatData *vardata, Datum constval) ...@@ -170,6 +170,7 @@ tsquerysel(VariableStatData *vardata, Datum constval)
if (get_attstatsslot(vardata->statsTuple, if (get_attstatsslot(vardata->statsTuple,
TEXTOID, -1, TEXTOID, -1,
STATISTIC_KIND_MCELEM, InvalidOid, STATISTIC_KIND_MCELEM, InvalidOid,
NULL,
&values, &nvalues, &values, &nvalues,
&numbers, &nnumbers)) &numbers, &nnumbers))
{ {
......
This diff is collapsed.
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/cache/lsyscache.c,v 1.165 2010/01/02 16:57:55 momjian Exp $ * $PostgreSQL: pgsql/src/backend/utils/cache/lsyscache.c,v 1.166 2010/01/04 02:44:40 tgl Exp $
* *
* NOTES * NOTES
* Eventually, the index information should go through here, too. * Eventually, the index information should go through here, too.
...@@ -2577,6 +2577,7 @@ get_attavgwidth(Oid relid, AttrNumber attnum) ...@@ -2577,6 +2577,7 @@ get_attavgwidth(Oid relid, AttrNumber attnum)
* atttypmod: typmod of attribute (can be 0 if values == NULL). * atttypmod: typmod of attribute (can be 0 if values == NULL).
* reqkind: STAKIND code for desired statistics slot kind. * reqkind: STAKIND code for desired statistics slot kind.
* reqop: STAOP value wanted, or InvalidOid if don't care. * reqop: STAOP value wanted, or InvalidOid if don't care.
* actualop: if not NULL, *actualop receives the actual STAOP value.
* values, nvalues: if not NULL, the slot's stavalues are extracted. * values, nvalues: if not NULL, the slot's stavalues are extracted.
* numbers, nnumbers: if not NULL, the slot's stanumbers are extracted. * numbers, nnumbers: if not NULL, the slot's stanumbers are extracted.
* *
...@@ -2589,6 +2590,7 @@ bool ...@@ -2589,6 +2590,7 @@ bool
get_attstatsslot(HeapTuple statstuple, get_attstatsslot(HeapTuple statstuple,
Oid atttype, int32 atttypmod, Oid atttype, int32 atttypmod,
int reqkind, Oid reqop, int reqkind, Oid reqop,
Oid *actualop,
Datum **values, int *nvalues, Datum **values, int *nvalues,
float4 **numbers, int *nnumbers) float4 **numbers, int *nnumbers)
{ {
...@@ -2611,6 +2613,9 @@ get_attstatsslot(HeapTuple statstuple, ...@@ -2611,6 +2613,9 @@ get_attstatsslot(HeapTuple statstuple,
if (i >= STATISTIC_NUM_SLOTS) if (i >= STATISTIC_NUM_SLOTS)
return false; /* not there */ return false; /* not there */
if (actualop)
*actualop = (&stats->staop1)[i];
if (values) if (values)
{ {
val = SysCacheGetAttr(STATRELATTINH, statstuple, val = SysCacheGetAttr(STATRELATTINH, statstuple,
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/utils/lsyscache.h,v 1.130 2010/01/02 16:58:10 momjian Exp $ * $PostgreSQL: pgsql/src/include/utils/lsyscache.h,v 1.131 2010/01/04 02:44:40 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -129,6 +129,7 @@ extern int32 get_attavgwidth(Oid relid, AttrNumber attnum); ...@@ -129,6 +129,7 @@ extern int32 get_attavgwidth(Oid relid, AttrNumber attnum);
extern bool get_attstatsslot(HeapTuple statstuple, extern bool get_attstatsslot(HeapTuple statstuple,
Oid atttype, int32 atttypmod, Oid atttype, int32 atttypmod,
int reqkind, Oid reqop, int reqkind, Oid reqop,
Oid *actualop,
Datum **values, int *nvalues, Datum **values, int *nvalues,
float4 **numbers, int *nnumbers); float4 **numbers, int *nnumbers);
extern void free_attstatsslot(Oid atttype, extern void free_attstatsslot(Oid atttype,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment