1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-17 06:41:09 +03:00

Instead of having a configure-time DEFAULT_ATTSTATTARGET, store -1 in

attstattarget to indicate 'use the default'.  The default is now a GUC
variable default_statistics_target, and so may be changed on the fly.  Along
the way we gain the ability to have pg_dump dump the per-column statistics
target when it's not the default.  Patch by Neil Conway, with some kibitzing
from Tom Lane.
This commit is contained in:
Tom Lane
2002-07-31 17:19:54 +00:00
parent 8be3cfbbd5
commit ce7565ab91
18 changed files with 125 additions and 60 deletions

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/analyze.c,v 1.38 2002/06/20 20:29:26 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/commands/analyze.c,v 1.39 2002/07/31 17:19:51 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@ -107,6 +107,11 @@ typedef struct
#define swapInt(a,b) do {int _tmp; _tmp=a; a=b; b=_tmp;} while(0)
#define swapDatum(a,b) do {Datum _tmp; _tmp=a; a=b; b=_tmp;} while(0)
/* Default statistics target (GUC parameter) */
int default_statistics_target = 10;
static int elevel = -1;
static MemoryContext anl_context = NULL;
@ -384,7 +389,7 @@ examine_attribute(Relation onerel, int attnum)
VacAttrStats *stats;
/* Don't analyze column if user has specified not to */
if (attr->attstattarget <= 0)
if (attr->attstattarget == 0)
return NULL;
/* If column has no "=" operator, we can't do much of anything */
@ -425,6 +430,10 @@ examine_attribute(Relation onerel, int attnum)
stats->eqopr = eqopr;
stats->eqfunc = eqfunc;
/* If the attstattarget column is negative, use the default value */
if (stats->attr->attstattarget < 0)
stats->attr->attstattarget = default_statistics_target;
/* Is there a "<" operator with suitable semantics? */
func_operator = compatible_oper(makeList1(makeString("<")),
attr->atttypid,
@ -466,14 +475,14 @@ examine_attribute(Relation onerel, int attnum)
* know it at this point.
*--------------------
*/
stats->minrows = 300 * attr->attstattarget;
stats->minrows = 300 * stats->attr->attstattarget;
}
else
{
/* Can't do much but the minimal stuff */
stats->algcode = ALG_MINIMAL;
/* Might as well use the same minrows as above */
stats->minrows = 300 * attr->attstattarget;
stats->minrows = 300 * stats->attr->attstattarget;
}
return stats;

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/tablecmds.c,v 1.24 2002/07/20 05:16:57 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/commands/tablecmds.c,v 1.25 2002/07/31 17:19:51 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@ -1668,7 +1668,7 @@ AlterTableAddColumn(Oid myrelid,
attribute->attrelid = myrelid;
namestrcpy(&(attribute->attname), colDef->colname);
attribute->atttypid = HeapTupleGetOid(typeTuple);
attribute->attstattarget = DEFAULT_ATTSTATTARGET;
attribute->attstattarget = -1;
attribute->attlen = tform->typlen;
attribute->attcacheoff = -1;
attribute->atttypmod = colDef->typename->typmod;
@ -2184,12 +2184,18 @@ AlterTableAlterColumnFlags(Oid myrelid,
newtarget = intVal(flagValue);
/*
* Limit target to sane range (should we raise an error instead?)
* Limit target to a sane range
*/
if (newtarget < 0)
newtarget = 0;
if (newtarget < -1)
{
elog(ERROR, "ALTER TABLE: statistics target %d is too low",
newtarget);
}
else if (newtarget > 1000)
{
elog(WARNING, "ALTER TABLE: lowering statistics target to 1000");
newtarget = 1000;
}
}
else if (*flagType == 'M')
{