diff --git a/contrib/pgstattuple/pgstatapprox.c b/contrib/pgstattuple/pgstatapprox.c index ff7c255a2d..d36758af9a 100644 --- a/contrib/pgstattuple/pgstatapprox.c +++ b/contrib/pgstattuple/pgstatapprox.c @@ -89,6 +89,9 @@ statapprox_heap(Relation rel, output_type *stat) /* * If the page has only visible tuples, then we can find out the free * space from the FSM and move on. + * + * Note: If a relation has no FSM, GetRecordedFreeSpace() will report + * zero free space. This is fine for the purposes of approximation. */ if (VM_ALL_VISIBLE(rel, blkno, &vmbuffer)) { diff --git a/doc/src/sgml/pgfreespacemap.sgml b/doc/src/sgml/pgfreespacemap.sgml index 0122d278e3..0bcf79b02b 100644 --- a/doc/src/sgml/pgfreespacemap.sgml +++ b/doc/src/sgml/pgfreespacemap.sgml @@ -61,6 +61,8 @@ The values stored in the free space map are not exact. They're rounded to precision of 1/256th of BLCKSZ (32 bytes with default BLCKSZ), and they're not kept fully up-to-date as tuples are inserted and updated. + In addition, small tables don't have a free space map, so these functions + will return zero even if free space is available. diff --git a/doc/src/sgml/pgstattuple.sgml b/doc/src/sgml/pgstattuple.sgml index b17b3c59e0..8797131c64 100644 --- a/doc/src/sgml/pgstattuple.sgml +++ b/doc/src/sgml/pgstattuple.sgml @@ -527,7 +527,9 @@ approx_free_percent | 2.09 bit set, then it is assumed to contain no dead tuples). For such pages, it derives the free space value from the free space map, and assumes that the rest of the space on the page is taken up by live - tuples. + tuples. Small tables don't have a free space map, so in that case + this function will report zero free space, likewise inflating the + approximate tuple length.