Add attribute optimization statistics.
This commit is contained in:
parent
4c0faba0fe
commit
2300ac0dc4
File diff suppressed because it is too large
Load Diff
|
@ -7,7 +7,7 @@
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.20 1997/01/22 01:42:54 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.21 1997/02/07 16:22:50 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -1486,7 +1486,7 @@ any_ordering_op(int restype)
|
||||||
Operator order_op;
|
Operator order_op;
|
||||||
Oid order_opid;
|
Oid order_opid;
|
||||||
|
|
||||||
order_op = oper("<",restype,restype);
|
order_op = oper("<",restype,restype,false);
|
||||||
order_opid = oprid(order_op);
|
order_opid = oprid(order_op);
|
||||||
|
|
||||||
return order_opid;
|
return order_opid;
|
||||||
|
@ -1554,7 +1554,7 @@ transformSortClause(ParseState *pstate,
|
||||||
sortcl->resdom = resdom = restarget->resdom;
|
sortcl->resdom = resdom = restarget->resdom;
|
||||||
sortcl->opoid = oprid(oper(sortby->useOp,
|
sortcl->opoid = oprid(oper(sortby->useOp,
|
||||||
resdom->restype,
|
resdom->restype,
|
||||||
resdom->restype));
|
resdom->restype,false));
|
||||||
if (sortlist == NIL) {
|
if (sortlist == NIL) {
|
||||||
s = sortlist = lcons(sortcl, NIL);
|
s = sortlist = lcons(sortcl, NIL);
|
||||||
}else {
|
}else {
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/parser/Attic/catalog_utils.c,v 1.15 1997/01/22 01:43:08 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/parser/Attic/catalog_utils.c,v 1.16 1997/02/07 16:23:08 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -473,7 +473,7 @@ binary_oper_select_candidate(Oid arg1,
|
||||||
/* Given operator, types of arg1, and arg2, return oper struct */
|
/* Given operator, types of arg1, and arg2, return oper struct */
|
||||||
/* arg1, arg2 --typeids */
|
/* arg1, arg2 --typeids */
|
||||||
Operator
|
Operator
|
||||||
oper(char *op, Oid arg1, Oid arg2)
|
oper(char *op, Oid arg1, Oid arg2, bool noWarnings)
|
||||||
{
|
{
|
||||||
HeapTuple tup;
|
HeapTuple tup;
|
||||||
CandidateList candidates;
|
CandidateList candidates;
|
||||||
|
@ -492,7 +492,8 @@ oper(char *op, Oid arg1, Oid arg2)
|
||||||
/*
|
/*
|
||||||
* no operators of the desired types found
|
* no operators of the desired types found
|
||||||
*/
|
*/
|
||||||
op_error(op, arg1, arg2);
|
if (!noWarnings)
|
||||||
|
op_error(op, arg1, arg2);
|
||||||
return(NULL);
|
return(NULL);
|
||||||
} else if (ncandidates == 1) {
|
} else if (ncandidates == 1) {
|
||||||
/*
|
/*
|
||||||
|
@ -523,11 +524,12 @@ oper(char *op, Oid arg1, Oid arg2)
|
||||||
/* we chose none of them */
|
/* we chose none of them */
|
||||||
tp1 = get_id_type(arg1);
|
tp1 = get_id_type(arg1);
|
||||||
tp2 = get_id_type(arg2);
|
tp2 = get_id_type(arg2);
|
||||||
elog(NOTICE, "there is more than one operator %s for types", op);
|
if (!noWarnings) {
|
||||||
elog(NOTICE, "%s and %s. You will have to retype this query",
|
elog(NOTICE, "there is more than one operator %s for types", op);
|
||||||
tname(tp1), tname(tp2));
|
elog(NOTICE, "%s and %s. You will have to retype this query",
|
||||||
elog(WARN, "using an explicit cast");
|
tname(tp1), tname(tp2));
|
||||||
|
elog(WARN, "using an explicit cast");
|
||||||
|
}
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/parser/Attic/parse_query.c,v 1.12 1997/01/22 01:43:19 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/parser/Attic/parse_query.c,v 1.13 1997/02/07 16:23:21 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -352,7 +352,7 @@ make_op(char *opname, Node *ltree, Node *rtree)
|
||||||
|
|
||||||
/* right operator */
|
/* right operator */
|
||||||
ltypeId = (ltree==NULL) ? UNKNOWNOID : exprType(ltree);
|
ltypeId = (ltree==NULL) ? UNKNOWNOID : exprType(ltree);
|
||||||
temp = right_oper(opname, ltypeId);
|
temp = oper(opname, ltypeId, rtypeId, false);
|
||||||
opform = (OperatorTupleForm) GETSTRUCT(temp);
|
opform = (OperatorTupleForm) GETSTRUCT(temp);
|
||||||
left = make_operand(opname, ltree, ltypeId, opform->oprleft);
|
left = make_operand(opname, ltree, ltypeId, opform->oprleft);
|
||||||
right = NULL;
|
right = NULL;
|
||||||
|
@ -411,7 +411,7 @@ make_op(char *opname, Node *ltree, Node *rtree)
|
||||||
((Const *)ltree)->constbyval = tbyval(newtype);
|
((Const *)ltree)->constbyval = tbyval(newtype);
|
||||||
}
|
}
|
||||||
|
|
||||||
temp = oper(opname, ltypeId, rtypeId);
|
temp = oper(opname, ltypeId, rtypeId, false);
|
||||||
opform = (OperatorTupleForm) GETSTRUCT(temp);
|
opform = (OperatorTupleForm) GETSTRUCT(temp);
|
||||||
left = make_operand(opname, ltree, ltypeId, opform->oprleft);
|
left = make_operand(opname, ltree, ltypeId, opform->oprleft);
|
||||||
right = make_operand(opname, rtree, rtypeId, opform->oprright);
|
right = make_operand(opname, rtree, rtypeId, opform->oprright);
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.4 1996/11/03 06:53:08 scrappy Exp $
|
* $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.5 1997/02/07 16:23:39 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -33,6 +33,7 @@
|
||||||
#include "utils/lsyscache.h" /* for get_oprrest() */
|
#include "utils/lsyscache.h" /* for get_oprrest() */
|
||||||
#include "catalog/pg_statistic.h"
|
#include "catalog/pg_statistic.h"
|
||||||
|
|
||||||
|
#include "commands/vacuum.h" /* for ATTNVALS_SCALE */
|
||||||
|
|
||||||
/* N is not a valid var/constant or relation id */
|
/* N is not a valid var/constant or relation id */
|
||||||
#define NONVALUE(N) ((N) == -1)
|
#define NONVALUE(N) ((N) == -1)
|
||||||
|
@ -68,7 +69,7 @@ eqsel(Oid opid,
|
||||||
if (nvals == 0)
|
if (nvals == 0)
|
||||||
*result = 0.0;
|
*result = 0.0;
|
||||||
else
|
else
|
||||||
*result = 1.0 / nvals;
|
*result = ((float64data)nvals) / ((float64data)ATTNVALS_SCALE);
|
||||||
}
|
}
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
@ -125,7 +126,7 @@ intltsel(Oid opid,
|
||||||
if (nvals == 0)
|
if (nvals == 0)
|
||||||
*result = 1.0 / 3.0;
|
*result = 1.0 / 3.0;
|
||||||
else
|
else
|
||||||
*result = 3.0 / nvals;
|
*result = 3.0 * ((float64data)nvals) / ((float64data)ATTNVALS_SCALE);
|
||||||
}else {
|
}else {
|
||||||
bottom = high - low;
|
bottom = high - low;
|
||||||
if (bottom == 0)
|
if (bottom == 0)
|
||||||
|
@ -192,7 +193,7 @@ eqjoinsel(Oid opid,
|
||||||
if (max == 0)
|
if (max == 0)
|
||||||
*result = 1.0;
|
*result = 1.0;
|
||||||
else
|
else
|
||||||
*result = 1.0 / max;
|
*result = ((float64data)max) / ((float64data)ATTNVALS_SCALE);
|
||||||
}
|
}
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,13 +6,16 @@
|
||||||
*
|
*
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
* Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: vacuum.h,v 1.5 1997/01/13 03:44:54 momjian Exp $
|
* $Id: vacuum.h,v 1.6 1997/02/07 16:23:57 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
#ifndef VACUUM_H
|
#ifndef VACUUM_H
|
||||||
#define VACUUM_H
|
#define VACUUM_H
|
||||||
|
|
||||||
|
#include <access/funcindex.h>
|
||||||
|
#include <catalog/pg_index.h>
|
||||||
|
|
||||||
typedef struct VAttListData {
|
typedef struct VAttListData {
|
||||||
int val_dummy;
|
int val_dummy;
|
||||||
struct VAttListData *val_next;
|
struct VAttListData *val_next;
|
||||||
|
@ -38,23 +41,46 @@ typedef struct VPageListData {
|
||||||
|
|
||||||
typedef VPageListData *VPageList;
|
typedef VPageListData *VPageList;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
FuncIndexInfo finfo;
|
||||||
|
FuncIndexInfo *finfoP;
|
||||||
|
IndexTupleForm tform;
|
||||||
|
int natts;
|
||||||
|
} IndDesc;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
AttributeTupleForm attr;
|
||||||
|
Datum best, guess1, guess2, max, min;
|
||||||
|
int16 best_len, guess1_len, guess2_len, max_len, min_len;
|
||||||
|
int32 best_cnt, guess1_cnt, guess1_hits, guess2_hits, null_cnt,nonnull_cnt;
|
||||||
|
int32 max_cnt, min_cnt;
|
||||||
|
regproc cmpeq, cmplt, cmpgt, outfunc;
|
||||||
|
bool initialized;
|
||||||
|
} VacAttrStats;
|
||||||
|
|
||||||
typedef struct VRelListData {
|
typedef struct VRelListData {
|
||||||
Oid vrl_relid;
|
Oid vrl_relid;
|
||||||
VAttList vrl_attlist;
|
|
||||||
int vrl_ntups;
|
|
||||||
int vrl_npages;
|
|
||||||
Size vrl_min_tlen;
|
|
||||||
Size vrl_max_tlen;
|
|
||||||
bool vrl_hasindex;
|
|
||||||
struct VRelListData *vrl_next;
|
struct VRelListData *vrl_next;
|
||||||
} VRelListData;
|
} VRelListData;
|
||||||
|
|
||||||
typedef VRelListData *VRelList;
|
typedef VRelListData *VRelList;
|
||||||
|
|
||||||
|
typedef struct VRelStats {
|
||||||
|
Oid relid;
|
||||||
|
int ntups;
|
||||||
|
int npages;
|
||||||
|
Size min_tlen;
|
||||||
|
Size max_tlen;
|
||||||
|
bool hasindex;
|
||||||
|
int natts;
|
||||||
|
VacAttrStats *vacattrstats;
|
||||||
|
} VRelStats;
|
||||||
|
|
||||||
extern bool VacuumRunning;
|
extern bool VacuumRunning;
|
||||||
|
|
||||||
extern void vc_abort(void);
|
extern void vc_abort(void);
|
||||||
extern void vacuum(char *vacrel, bool verbose);
|
extern void vacuum(char *vacrel, bool verbose);
|
||||||
|
|
||||||
|
#define ATTNVALS_SCALE 1000000000 /* XXX so it can act as a float4 */
|
||||||
|
|
||||||
#endif /* VACUUM_H */
|
#endif /* VACUUM_H */
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*
|
*
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
* Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: catalog_utils.h,v 1.7 1997/01/22 01:44:02 momjian Exp $
|
* $Id: catalog_utils.h,v 1.8 1997/02/07 16:24:12 momjian Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
@ -31,7 +31,7 @@ extern bool tbyval(Type t);
|
||||||
extern char *tname(Type t);
|
extern char *tname(Type t);
|
||||||
extern int tbyvalue(Type t);
|
extern int tbyvalue(Type t);
|
||||||
extern Oid oprid(Operator op);
|
extern Oid oprid(Operator op);
|
||||||
extern Operator oper(char *op, Oid arg1, Oid arg2);
|
extern Operator oper(char *op, Oid arg1, Oid arg2, bool noWarnings);
|
||||||
extern Operator right_oper(char *op, Oid arg);
|
extern Operator right_oper(char *op, Oid arg);
|
||||||
extern Operator left_oper(char *op, Oid arg);
|
extern Operator left_oper(char *op, Oid arg);
|
||||||
extern int varattno(Relation rd, char *a);
|
extern int varattno(Relation rd, char *a);
|
||||||
|
|
Loading…
Reference in New Issue