diff options
author | Simon Riggs <simon@2ndQuadrant.com> | 2017-04-05 18:22:32 -0400 |
---|---|---|
committer | Simon Riggs <simon@2ndQuadrant.com> | 2017-04-05 18:22:32 -0400 |
commit | 68ea2b7f9b52d35b5fcd9c8d44d88de5a64be3ba (patch) | |
tree | ef650aa6a264e2131f56971399b1a04dd8f588c8 | |
parent | 2686ee1b7ccfb9214064d4d2a98ea77382880306 (diff) | |
download | postgresql-68ea2b7f9b52d35b5fcd9c8d44d88de5a64be3ba.tar.gz postgresql-68ea2b7f9b52d35b5fcd9c8d44d88de5a64be3ba.zip |
Reduce lock level for CREATE STATISTICS
In line with other lock reductions related to planning.
Simon Riggs
-rw-r--r-- | doc/src/sgml/mvcc.sgml | 3 | ||||
-rw-r--r-- | src/backend/commands/statscmds.c | 8 |
2 files changed, 9 insertions, 2 deletions
diff --git a/doc/src/sgml/mvcc.sgml b/doc/src/sgml/mvcc.sgml index 82e69fe2d27..7aa32932fab 100644 --- a/doc/src/sgml/mvcc.sgml +++ b/doc/src/sgml/mvcc.sgml @@ -923,7 +923,8 @@ ERROR: could not serialize access due to read/write dependencies among transact <para> Acquired by <command>VACUUM</command> (without <option>FULL</option>), - <command>ANALYZE</>, <command>CREATE INDEX CONCURRENTLY</>, and + <command>ANALYZE</>, <command>CREATE INDEX CONCURRENTLY</>, + <command>CREATE STATISTICS</> and <command>ALTER TABLE VALIDATE</command> and other <command>ALTER TABLE</command> variants (for full details see <xref linkend="SQL-ALTERTABLE">). diff --git a/src/backend/commands/statscmds.c b/src/backend/commands/statscmds.c index 8d483dbb3a7..46abadcc811 100644 --- a/src/backend/commands/statscmds.c +++ b/src/backend/commands/statscmds.c @@ -96,7 +96,13 @@ CreateStatistics(CreateStatsStmt *stmt) errmsg("statistics \"%s\" already exist", namestr))); } - rel = heap_openrv(stmt->relation, AccessExclusiveLock); + /* + * CREATE STATISTICS will influence future execution plans but does + * not interfere with currently executing plans so it is safe to + * take only ShareUpdateExclusiveLock on relation, conflicting with + * ANALYZE and other DDL that sets statistical information. + */ + rel = heap_openrv(stmt->relation, ShareUpdateExclusiveLock); relid = RelationGetRelid(rel); if (rel->rd_rel->relkind != RELKIND_RELATION && |