mirror of
https://github.com/postgres/postgres.git
synced 2025-10-29 22:49:41 +03:00
Implement multivariate n-distinct coefficients
Add support for explicitly declared statistic objects (CREATE STATISTICS), allowing collection of statistics on more complex combinations that individual table columns. Companion commands DROP STATISTICS and ALTER STATISTICS ... OWNER TO / SET SCHEMA / RENAME are added too. All this DDL has been designed so that more statistic types can be added later on, such as multivariate most-common-values and multivariate histograms between columns of a single table, leaving room for permitting columns on multiple tables, too, as well as expressions. This commit only adds support for collection of n-distinct coefficient on user-specified sets of columns in a single table. This is useful to estimate number of distinct groups in GROUP BY and DISTINCT clauses; estimation errors there can cause over-allocation of memory in hashed aggregates, for instance, so it's a worthwhile problem to solve. A new special pseudo-type pg_ndistinct is used. (num-distinct estimation was deemed sufficiently useful by itself that this is worthwhile even if no further statistic types are added immediately; so much so that another version of essentially the same functionality was submitted by Kyotaro Horiguchi: https://postgr.es/m/20150828.173334.114731693.horiguchi.kyotaro@lab.ntt.co.jp though this commit does not use that code.) Author: Tomas Vondra. Some code rework by Álvaro. Reviewed-by: Dean Rasheed, David Rowley, Kyotaro Horiguchi, Jeff Janes, Ideriha Takeshi Discussion: https://postgr.es/m/543AFA15.4080608@fuzzy.cz https://postgr.es/m/20170320190220.ixlaueanxegqd5gr@alvherre.pgsql
This commit is contained in:
@@ -257,7 +257,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
|
||||
ConstraintsSetStmt CopyStmt CreateAsStmt CreateCastStmt
|
||||
CreateDomainStmt CreateExtensionStmt CreateGroupStmt CreateOpClassStmt
|
||||
CreateOpFamilyStmt AlterOpFamilyStmt CreatePLangStmt
|
||||
CreateSchemaStmt CreateSeqStmt CreateStmt CreateTableSpaceStmt
|
||||
CreateSchemaStmt CreateSeqStmt CreateStmt CreateStatsStmt CreateTableSpaceStmt
|
||||
CreateFdwStmt CreateForeignServerStmt CreateForeignTableStmt
|
||||
CreateAssertStmt CreateTransformStmt CreateTrigStmt CreateEventTrigStmt
|
||||
CreateUserStmt CreateUserMappingStmt CreateRoleStmt CreatePolicyStmt
|
||||
@@ -874,6 +874,7 @@ stmt :
|
||||
| CreateSeqStmt
|
||||
| CreateStmt
|
||||
| CreateSubscriptionStmt
|
||||
| CreateStatsStmt
|
||||
| CreateTableSpaceStmt
|
||||
| CreateTransformStmt
|
||||
| CreateTrigStmt
|
||||
@@ -3747,6 +3748,35 @@ OptConsTableSpace: USING INDEX TABLESPACE name { $$ = $4; }
|
||||
ExistingIndex: USING INDEX index_name { $$ = $3; }
|
||||
;
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* QUERY :
|
||||
* CREATE STATISTICS stats_name WITH (options) ON (columns) FROM relname
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
|
||||
CreateStatsStmt: CREATE STATISTICS any_name opt_reloptions ON '(' columnList ')' FROM qualified_name
|
||||
{
|
||||
CreateStatsStmt *n = makeNode(CreateStatsStmt);
|
||||
n->defnames = $3;
|
||||
n->relation = $10;
|
||||
n->keys = $7;
|
||||
n->options = $4;
|
||||
n->if_not_exists = false;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
| CREATE STATISTICS IF_P NOT EXISTS any_name opt_reloptions ON '(' columnList ')' FROM qualified_name
|
||||
{
|
||||
CreateStatsStmt *n = makeNode(CreateStatsStmt);
|
||||
n->defnames = $6;
|
||||
n->relation = $13;
|
||||
n->keys = $10;
|
||||
n->options = $7;
|
||||
n->if_not_exists = true;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
;
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
@@ -6042,6 +6072,7 @@ drop_type_any_name:
|
||||
| FOREIGN TABLE { $$ = OBJECT_FOREIGN_TABLE; }
|
||||
| COLLATION { $$ = OBJECT_COLLATION; }
|
||||
| CONVERSION_P { $$ = OBJECT_CONVERSION; }
|
||||
| STATISTICS { $$ = OBJECT_STATISTIC_EXT; }
|
||||
| TEXT_P SEARCH PARSER { $$ = OBJECT_TSPARSER; }
|
||||
| TEXT_P SEARCH DICTIONARY { $$ = OBJECT_TSDICTIONARY; }
|
||||
| TEXT_P SEARCH TEMPLATE { $$ = OBJECT_TSTEMPLATE; }
|
||||
@@ -6119,7 +6150,7 @@ opt_restart_seqs:
|
||||
* EXTENSION | EVENT TRIGGER | FOREIGN DATA WRAPPER |
|
||||
* FOREIGN TABLE | INDEX | [PROCEDURAL] LANGUAGE |
|
||||
* MATERIALIZED VIEW | POLICY | ROLE | SCHEMA | SEQUENCE |
|
||||
* SERVER | TABLE | TABLESPACE |
|
||||
* SERVER | STATISTICS | TABLE | TABLESPACE |
|
||||
* TEXT SEARCH CONFIGURATION | TEXT SEARCH DICTIONARY |
|
||||
* TEXT SEARCH PARSER | TEXT SEARCH TEMPLATE | TYPE |
|
||||
* VIEW] <objname> |
|
||||
@@ -6288,6 +6319,7 @@ comment_type_any_name:
|
||||
COLUMN { $$ = OBJECT_COLUMN; }
|
||||
| INDEX { $$ = OBJECT_INDEX; }
|
||||
| SEQUENCE { $$ = OBJECT_SEQUENCE; }
|
||||
| STATISTICS { $$ = OBJECT_STATISTIC_EXT; }
|
||||
| TABLE { $$ = OBJECT_TABLE; }
|
||||
| VIEW { $$ = OBJECT_VIEW; }
|
||||
| MATERIALIZED VIEW { $$ = OBJECT_MATVIEW; }
|
||||
@@ -8428,6 +8460,15 @@ RenameStmt: ALTER AGGREGATE aggregate_with_argtypes RENAME TO name
|
||||
n->missing_ok = false;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
| ALTER STATISTICS any_name RENAME TO name
|
||||
{
|
||||
RenameStmt *n = makeNode(RenameStmt);
|
||||
n->renameType = OBJECT_STATISTIC_EXT;
|
||||
n->object = (Node *) $3;
|
||||
n->newname = $6;
|
||||
n->missing_ok = false;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
| ALTER TEXT_P SEARCH PARSER any_name RENAME TO name
|
||||
{
|
||||
RenameStmt *n = makeNode(RenameStmt);
|
||||
@@ -8643,6 +8684,15 @@ AlterObjectSchemaStmt:
|
||||
n->missing_ok = true;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
| ALTER STATISTICS any_name SET SCHEMA name
|
||||
{
|
||||
AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
|
||||
n->objectType = OBJECT_STATISTIC_EXT;
|
||||
n->object = (Node *) $3;
|
||||
n->newschema = $6;
|
||||
n->missing_ok = false;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
| ALTER TEXT_P SEARCH PARSER any_name SET SCHEMA name
|
||||
{
|
||||
AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
|
||||
@@ -8906,6 +8956,14 @@ AlterOwnerStmt: ALTER AGGREGATE aggregate_with_argtypes OWNER TO RoleSpec
|
||||
n->newowner = $6;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
| ALTER STATISTICS any_name OWNER TO RoleSpec
|
||||
{
|
||||
AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
|
||||
n->objectType = OBJECT_STATISTIC_EXT;
|
||||
n->object = (Node *) $3;
|
||||
n->newowner = $6;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
| ALTER TEXT_P SEARCH DICTIONARY any_name OWNER TO RoleSpec
|
||||
{
|
||||
AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
|
||||
|
||||
Reference in New Issue
Block a user