mirror of
https://github.com/postgres/postgres.git
synced 2025-10-19 15:49:24 +03:00
Sync up our various ways of estimating pg_class.reltuples.
VACUUM thought that reltuples represents the total number of tuples in the relation, while ANALYZE counted only live tuples. This can cause "flapping" in the value when background vacuums and analyzes happen separately. The planner's use of reltuples essentially assumes that it's the count of live (visible) tuples, so let's standardize on having it mean live tuples. Another issue is that the definition of "live tuple" isn't totally clear; what should be done with INSERT_IN_PROGRESS or DELETE_IN_PROGRESS tuples? ANALYZE's choices in this regard are made on the assumption that if the originating transaction commits at all, it will happen after ANALYZE finishes, so we should ignore the effects of the in-progress transaction --- unless it is our own transaction, and then we should count it. Let's propagate this definition into VACUUM, too. Likewise propagate this definition into CREATE INDEX, and into contrib/pgstattuple's pgstattuple_approx() function. Tomas Vondra, reviewed by Haribabu Kommi, some corrections by me Discussion: https://postgr.es/m/16db4468-edfa-830a-f921-39a50498e77e@2ndquadrant.com
This commit is contained in:
@@ -771,6 +771,9 @@ vacuum_set_xid_limits(Relation rel,
|
||||
* subset of the table. When we have only partial information, we take
|
||||
* the old value of pg_class.reltuples as a measurement of the
|
||||
* tuple density in the unscanned pages.
|
||||
*
|
||||
* Note: scanned_tuples should count only *live* tuples, since
|
||||
* pg_class.reltuples is defined that way.
|
||||
*/
|
||||
double
|
||||
vac_estimate_reltuples(Relation relation,
|
||||
@@ -852,6 +855,9 @@ vac_estimate_reltuples(Relation relation,
|
||||
* transaction. This is OK since postponing the flag maintenance is
|
||||
* always allowable.
|
||||
*
|
||||
* Note: num_tuples should count only *live* tuples, since
|
||||
* pg_class.reltuples is defined that way.
|
||||
*
|
||||
* This routine is shared by VACUUM and ANALYZE.
|
||||
*/
|
||||
void
|
||||
|
Reference in New Issue
Block a user