• Updates cause new versions of rows, and index entries for each.

  • Heap rows have xmin, xmax, so we can distinguish visible from invisible rows.

  • Index rows don't have this information, so on an index scan, we have to fetch and examine all qualifying rows, some (many?) of which may be obsolete.

  • The PK index is logically unique, but not physically unique. Keys are duplicated due to row versions.

  • select * from T where id = 2: Find all the rows with id = 2. At most one should be visible.