diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml new file mode 100644 index 03cc6c9..e042293 *** a/doc/src/sgml/maintenance.sgml --- b/doc/src/sgml/maintenance.sgml *************** *** 102,107 **** --- 102,112 ---- + To update the visibility map, which speeds up index-only + scans. + + + To protect against loss of very old data due to transaction ID wraparound. *************** *** 329,334 **** --- 334,361 ---- + + Updating Visibility Map + + + Vacuum maintains the table , which keeps track + of pages that only contain tuples that are visible to all transactions. + This has two purposes. First, vacuum itself can skip such pages on the + next run, since there is nothing to clean up. + + + + Second, index-only scans also take advantage of the visibility map. Since + PostgreSQL indexes don't contain tuple + visibility information, a normal index scan fetches the heap tuple for each + matching index entry, to check whether it should be seen by the current + transaction. An index-only scan, on the other hand, checks the + visibility map first. If it's known that all tuples on the page are + visible, the heap fetch can be skipped. This is most noticeable on + large data sets where the visibility map can prevent disk accesses. + + + Preventing Transaction ID Wraparound Failures diff --git a/doc/src/sgml/storage.sgml b/doc/src/sgml/storage.sgml new file mode 100644 index cb2f60e..a1c300d *** a/doc/src/sgml/storage.sgml --- b/doc/src/sgml/storage.sgml *************** Note that indexes do not have VMs. *** 494,504 **** The visibility map simply stores one bit per heap page. A set bit means that all tuples on the page are known to be visible to all transactions. ! This means that the page does not contain any tuples that need to be vacuumed; ! in future it might also be used to avoid visiting the page for visibility ! checks. The map is conservative in the sense that we ! make sure that whenever a bit is set, we know the condition is true, but if ! a bit is not set, it might or might not be true. --- 494,509 ---- The visibility map simply stores one bit per heap page. A set bit means that all tuples on the page are known to be visible to all transactions. ! This information is used by vacuum to skip pages that do not contain any ! tuples that need to be vacuumed and by index-only scans to skip ! row visibility checks to the table heap. ! ! ! ! The map is conservative in the sense that we make sure that whenever a bit is ! set, we know the condition is true, but if a bit is not set, it might or ! might not be true. Visibility map bits are only set by vacuum, but are ! cleared by any data-modifying operations on a page.