mirror of https://github.com/citusdata/citus.git
Propagate statistics with altered targets
parent
48ca1637a4
commit
d4bc17f6f0
|
@ -45,7 +45,9 @@
|
||||||
|
|
||||||
static List * GetExplicitStatisticsIdList(Oid relationId);
|
static List * GetExplicitStatisticsIdList(Oid relationId);
|
||||||
static Oid GetRelIdByStatsOid(Oid statsOid);
|
static Oid GetRelIdByStatsOid(Oid statsOid);
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_13
|
||||||
|
static char * CreateAlterCommandIfTargetNotDefault(Oid statsOid);
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PreprocessCreateStatisticsStmt is called during the planning phase for
|
* PreprocessCreateStatisticsStmt is called during the planning phase for
|
||||||
|
@ -311,7 +313,7 @@ AlterStatisticsSchemaStmtObjectAddress(Node *node, bool missingOk)
|
||||||
ObjectAddress address = { 0 };
|
ObjectAddress address = { 0 };
|
||||||
Value *statName = llast((List *) stmt->object);
|
Value *statName = llast((List *) stmt->object);
|
||||||
Oid statsOid = get_statistics_object_oid(list_make2(makeString(stmt->newschema),
|
Oid statsOid = get_statistics_object_oid(list_make2(makeString(stmt->newschema),
|
||||||
statName), false);
|
statName), missingOk);
|
||||||
ObjectAddressSet(address, StatisticExtRelationId, statsOid);
|
ObjectAddressSet(address, StatisticExtRelationId, statsOid);
|
||||||
|
|
||||||
return address;
|
return address;
|
||||||
|
@ -406,6 +408,7 @@ List *
|
||||||
GetExplicitStatisticsCommandList(Oid relationId)
|
GetExplicitStatisticsCommandList(Oid relationId)
|
||||||
{
|
{
|
||||||
List *createStatisticsCommandList = NIL;
|
List *createStatisticsCommandList = NIL;
|
||||||
|
List *alterStatisticsCommandList = NIL;
|
||||||
|
|
||||||
PushOverrideEmptySearchPath(CurrentMemoryContext);
|
PushOverrideEmptySearchPath(CurrentMemoryContext);
|
||||||
|
|
||||||
|
@ -420,11 +423,25 @@ GetExplicitStatisticsCommandList(Oid relationId)
|
||||||
createStatisticsCommandList = lappend(
|
createStatisticsCommandList = lappend(
|
||||||
createStatisticsCommandList,
|
createStatisticsCommandList,
|
||||||
makeTableDDLCommandString(createStatisticsCommand));
|
makeTableDDLCommandString(createStatisticsCommand));
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_13
|
||||||
|
char *alterStatisticsTargetCommand = CreateAlterCommandIfTargetNotDefault(
|
||||||
|
statisticsId);
|
||||||
|
|
||||||
|
if (alterStatisticsTargetCommand != NULL)
|
||||||
|
{
|
||||||
|
alterStatisticsCommandList = lappend(alterStatisticsCommandList,
|
||||||
|
makeTableDDLCommandString(
|
||||||
|
alterStatisticsTargetCommand));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* revert back to original search_path */
|
/* revert back to original search_path */
|
||||||
PopOverrideSearchPath();
|
PopOverrideSearchPath();
|
||||||
|
|
||||||
|
createStatisticsCommandList = list_concat(createStatisticsCommandList,
|
||||||
|
alterStatisticsCommandList);
|
||||||
|
|
||||||
return createStatisticsCommandList;
|
return createStatisticsCommandList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -540,3 +557,45 @@ GetRelIdByStatsOid(Oid statsOid)
|
||||||
|
|
||||||
return statisticsForm->stxrelid;
|
return statisticsForm->stxrelid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if PG_VERSION_NUM >= PG_VERSION_13
|
||||||
|
|
||||||
|
/*
|
||||||
|
* CreateAlterCommandIfTargetNotDefault returns an ALTER STATISTICS .. SET STATISTICS
|
||||||
|
* command if the stats object with given id has a target different than the default one.
|
||||||
|
* Returns NULL otherwise.
|
||||||
|
*/
|
||||||
|
static char *
|
||||||
|
CreateAlterCommandIfTargetNotDefault(Oid statsOid)
|
||||||
|
{
|
||||||
|
HeapTuple tup = SearchSysCache1(STATEXTOID, ObjectIdGetDatum(statsOid));
|
||||||
|
|
||||||
|
if (!HeapTupleIsValid(tup))
|
||||||
|
{
|
||||||
|
ereport(WARNING, (errmsg("No stats object found with id: %u", statsOid)));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Form_pg_statistic_ext statisticsForm = (Form_pg_statistic_ext) GETSTRUCT(tup);
|
||||||
|
ReleaseSysCache(tup);
|
||||||
|
|
||||||
|
if (statisticsForm->stxstattarget == -1)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
AlterStatsStmt *alterStatsStmt = palloc0(sizeof(AlterStatsStmt));
|
||||||
|
|
||||||
|
char *schemaName = get_namespace_name(statisticsForm->stxnamespace);
|
||||||
|
char *statName = NameStr(statisticsForm->stxname);
|
||||||
|
|
||||||
|
alterStatsStmt->type = T_AlterStatsStmt;
|
||||||
|
alterStatsStmt->stxstattarget = statisticsForm->stxstattarget;
|
||||||
|
alterStatsStmt->defnames = list_make2(makeString(schemaName), makeString(statName));
|
||||||
|
|
||||||
|
return DeparseAlterStatisticsStmt((Node *) alterStatsStmt);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -188,7 +188,7 @@ static void
|
||||||
AppendAlterStatisticsOwnerStmt(StringInfo buf, AlterOwnerStmt *stmt)
|
AppendAlterStatisticsOwnerStmt(StringInfo buf, AlterOwnerStmt *stmt)
|
||||||
{
|
{
|
||||||
List *names = (List *) stmt->object;
|
List *names = (List *) stmt->object;
|
||||||
appendStringInfo(buf, "ALTER STATISTICS %s OWNER TO %s;", NameListToQuotedString(
|
appendStringInfo(buf, "ALTER STATISTICS %s OWNER TO %s", NameListToQuotedString(
|
||||||
names),
|
names),
|
||||||
RoleSpecString(stmt->newowner, true));
|
RoleSpecString(stmt->newowner, true));
|
||||||
}
|
}
|
||||||
|
|
|
@ -223,7 +223,6 @@ RelayEventExtendNames(Node *parseTree, char *schemaName, uint64 shardId)
|
||||||
RangeVar *stat = makeRangeVarFromNameList((List *) alterOwnerStmt->object);
|
RangeVar *stat = makeRangeVarFromNameList((List *) alterOwnerStmt->object);
|
||||||
|
|
||||||
AppendShardIdToName(&stat->relname, shardId);
|
AppendShardIdToName(&stat->relname, shardId);
|
||||||
SetSchemaNameIfNotExist(&stat->schemaname, schemaName);
|
|
||||||
|
|
||||||
alterOwnerStmt->object = (Node *) MakeNameListFromRangeVar(stat);
|
alterOwnerStmt->object = (Node *) MakeNameListFromRangeVar(stat);
|
||||||
|
|
||||||
|
|
|
@ -75,15 +75,27 @@ CREATE STATISTICS s6 ON a,b FROM test_stats4;
|
||||||
DROP STATISTICS s7;
|
DROP STATISTICS s7;
|
||||||
ERROR: statistics object "statistics'Test.s7" does not exist
|
ERROR: statistics object "statistics'Test.s7" does not exist
|
||||||
ALTER STATISTICS s6 RENAME TO s7;
|
ALTER STATISTICS s6 RENAME TO s7;
|
||||||
|
ALTER STATISTICS sc1.st1 RENAME TO st1_new;
|
||||||
-- test altering stats schema
|
-- test altering stats schema
|
||||||
CREATE SCHEMA test_alter_schema;
|
CREATE SCHEMA test_alter_schema;
|
||||||
ALTER STATISTICS s7 SET SCHEMA test_alter_schema;
|
ALTER STATISTICS s7 SET SCHEMA test_alter_schema;
|
||||||
DROP STATISTICS test_alter_schema.s7;
|
|
||||||
-- test altering stats target
|
-- test altering stats target
|
||||||
ALTER STATISTICS s1 SET STATISTICS 3;
|
ALTER STATISTICS s1 SET STATISTICS 3;
|
||||||
-- since max value for target is 10000, this will automatically be lowered
|
-- since max value for target is 10000, this will automatically be lowered
|
||||||
ALTER STATISTICS s2 SET STATISTICS 999999;
|
ALTER STATISTICS s2 SET STATISTICS 999999;
|
||||||
WARNING: lowering statistics target to 10000
|
WARNING: lowering statistics target to 10000
|
||||||
|
-- test alter target before distribution
|
||||||
|
CREATE TABLE targettable(a int, b int);
|
||||||
|
CREATE STATISTICS s8 ON a,b FROM targettable;
|
||||||
|
ALTER STATISTICS s8 SET STATISTICS 46;
|
||||||
|
SELECT create_distributed_table('targettable', 'b');
|
||||||
|
create_distributed_table
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- test alter owner
|
||||||
|
ALTER STATISTICS s8 OWNER TO pg_monitor;
|
||||||
\c - - - :worker_1_port
|
\c - - - :worker_1_port
|
||||||
SELECT stxname
|
SELECT stxname
|
||||||
FROM pg_statistic_ext
|
FROM pg_statistic_ext
|
||||||
|
@ -143,23 +155,39 @@ ORDER BY stxname ASC;
|
||||||
s2_980058
|
s2_980058
|
||||||
s2_980060
|
s2_980060
|
||||||
s2_980062
|
s2_980062
|
||||||
st1_980064
|
s8_980129
|
||||||
st1_980066
|
s8_980131
|
||||||
st1_980068
|
s8_980133
|
||||||
st1_980070
|
s8_980135
|
||||||
st1_980072
|
s8_980137
|
||||||
st1_980074
|
s8_980139
|
||||||
st1_980076
|
s8_980141
|
||||||
st1_980078
|
s8_980143
|
||||||
st1_980080
|
s8_980145
|
||||||
st1_980082
|
s8_980147
|
||||||
st1_980084
|
s8_980149
|
||||||
st1_980086
|
s8_980151
|
||||||
st1_980088
|
s8_980153
|
||||||
st1_980090
|
s8_980155
|
||||||
st1_980092
|
s8_980157
|
||||||
st1_980094
|
s8_980159
|
||||||
(64 rows)
|
st1_new_980064
|
||||||
|
st1_new_980066
|
||||||
|
st1_new_980068
|
||||||
|
st1_new_980070
|
||||||
|
st1_new_980072
|
||||||
|
st1_new_980074
|
||||||
|
st1_new_980076
|
||||||
|
st1_new_980078
|
||||||
|
st1_new_980080
|
||||||
|
st1_new_980082
|
||||||
|
st1_new_980084
|
||||||
|
st1_new_980086
|
||||||
|
st1_new_980088
|
||||||
|
st1_new_980090
|
||||||
|
st1_new_980092
|
||||||
|
st1_new_980094
|
||||||
|
(80 rows)
|
||||||
|
|
||||||
SELECT count(DISTINCT stxnamespace)
|
SELECT count(DISTINCT stxnamespace)
|
||||||
FROM pg_statistic_ext
|
FROM pg_statistic_ext
|
||||||
|
@ -231,6 +259,22 @@ ORDER BY stxstattarget ASC;
|
||||||
3
|
3
|
||||||
3
|
3
|
||||||
3
|
3
|
||||||
|
46
|
||||||
|
46
|
||||||
|
46
|
||||||
|
46
|
||||||
|
46
|
||||||
|
46
|
||||||
|
46
|
||||||
|
46
|
||||||
|
46
|
||||||
|
46
|
||||||
|
46
|
||||||
|
46
|
||||||
|
46
|
||||||
|
46
|
||||||
|
46
|
||||||
|
46
|
||||||
10000
|
10000
|
||||||
10000
|
10000
|
||||||
10000
|
10000
|
||||||
|
@ -247,7 +291,13 @@ ORDER BY stxstattarget ASC;
|
||||||
10000
|
10000
|
||||||
10000
|
10000
|
||||||
10000
|
10000
|
||||||
(64 rows)
|
(80 rows)
|
||||||
|
|
||||||
|
SELECT COUNT(DISTINCT stxowner) FROM pg_statistic_ext;
|
||||||
|
count
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
2
|
||||||
|
(1 row)
|
||||||
|
|
||||||
\c - - - :master_port
|
\c - - - :master_port
|
||||||
SET client_min_messages TO WARNING;
|
SET client_min_messages TO WARNING;
|
||||||
|
|
|
@ -61,16 +61,24 @@ DROP STATISTICS IF EXISTS s5,s5,s6,s6;
|
||||||
CREATE STATISTICS s6 ON a,b FROM test_stats4;
|
CREATE STATISTICS s6 ON a,b FROM test_stats4;
|
||||||
DROP STATISTICS s7;
|
DROP STATISTICS s7;
|
||||||
ALTER STATISTICS s6 RENAME TO s7;
|
ALTER STATISTICS s6 RENAME TO s7;
|
||||||
|
ALTER STATISTICS sc1.st1 RENAME TO st1_new;
|
||||||
|
|
||||||
-- test altering stats schema
|
-- test altering stats schema
|
||||||
CREATE SCHEMA test_alter_schema;
|
CREATE SCHEMA test_alter_schema;
|
||||||
ALTER STATISTICS s7 SET SCHEMA test_alter_schema;
|
ALTER STATISTICS s7 SET SCHEMA test_alter_schema;
|
||||||
DROP STATISTICS test_alter_schema.s7;
|
|
||||||
|
|
||||||
-- test altering stats target
|
-- test altering stats target
|
||||||
ALTER STATISTICS s1 SET STATISTICS 3;
|
ALTER STATISTICS s1 SET STATISTICS 3;
|
||||||
-- since max value for target is 10000, this will automatically be lowered
|
-- since max value for target is 10000, this will automatically be lowered
|
||||||
ALTER STATISTICS s2 SET STATISTICS 999999;
|
ALTER STATISTICS s2 SET STATISTICS 999999;
|
||||||
|
-- test alter target before distribution
|
||||||
|
CREATE TABLE targettable(a int, b int);
|
||||||
|
CREATE STATISTICS s8 ON a,b FROM targettable;
|
||||||
|
ALTER STATISTICS s8 SET STATISTICS 46;
|
||||||
|
SELECT create_distributed_table('targettable', 'b');
|
||||||
|
|
||||||
|
-- test alter owner
|
||||||
|
ALTER STATISTICS s8 OWNER TO pg_monitor;
|
||||||
|
|
||||||
\c - - - :worker_1_port
|
\c - - - :worker_1_port
|
||||||
SELECT stxname
|
SELECT stxname
|
||||||
|
@ -99,6 +107,8 @@ WHERE stxnamespace IN (
|
||||||
)
|
)
|
||||||
ORDER BY stxstattarget ASC;
|
ORDER BY stxstattarget ASC;
|
||||||
|
|
||||||
|
SELECT COUNT(DISTINCT stxowner) FROM pg_statistic_ext;
|
||||||
|
|
||||||
\c - - - :master_port
|
\c - - - :master_port
|
||||||
SET client_min_messages TO WARNING;
|
SET client_min_messages TO WARNING;
|
||||||
DROP SCHEMA "statistics'Test" CASCADE;
|
DROP SCHEMA "statistics'Test" CASCADE;
|
||||||
|
|
Loading…
Reference in New Issue