pgsql: Don't build extended statistics on inheritance trees - Mailing list pgsql-committers

From Tomas Vondra
Subject pgsql: Don't build extended statistics on inheritance trees
Date
Msg-id E1hsWX6-0004xZ-Mk@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
Don't build extended statistics on inheritance trees

When performing ANALYZE on inheritance trees, we collect two samples for
each relation - one for the relation alone, and one for the inheritance
subtree (relation and its child relations). And then we build statistics
on each sample, so for each relation we get two sets of statistics.

For regular (per-column) statistics this works fine, because the catalog
includes a flag differentiating statistics built from those two samples.
But we don't have such flag in the extended statistics catalogs, and we
ended up updating the same row twice, triggering this error:

  ERROR:  tuple already updated by self

The simplest solution is to disable extended statistics on inheritance
trees, which is what this commit is doing. In the future we may need to
do something similar to per-column statistics, but that requires adding a
flag to the catalog - and that's not backpatchable. Moreover, the current
selectivity estimation code only works with individual relations, so
building statistics on inheritance trees would be pointless anyway.

Author: Tomas Vondra
Backpatch-to: 10-
Discussion: https://postgr.es/m/20190618231233.GA27470@telsasoft.com
Reported-by: Justin Pryzby

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/14ef15a22246ca17c949e7a9d1abe14c8874d743

Modified Files
--------------
src/backend/commands/analyze.c          | 12 +++++++++---
src/test/regress/expected/stats_ext.out |  8 ++++++++
src/test/regress/sql/stats_ext.sql      |  8 ++++++++
3 files changed, 25 insertions(+), 3 deletions(-)


pgsql-committers by date:

Previous
From: Tomas Vondra
Date:
Subject: pgsql: Don't build extended statistics on inheritance trees
Next
From: Heikki Linnakangas
Date:
Subject: pgsql: Print WAL position correctly in pg_rewind error message.