Difference between idx_tup_read and idx_tup_fetch on Postgres

When looking at the source code of the view, then you'll see that idx_tup_read is the result of calling pg_stat_get_tuples_returned() and idx_tup_fetch is the result of calling pg_stat_get_tuples_fetched()

The manual describes the two functions as follows:

pg_stat_get_tuples_returned(oid)

Number of rows read by sequential scans when argument is a table, or number of index entries returned when argument is an index

pg_stat_get_tuples_fetched(oid)

Number of table rows fetched by bitmap scans when argument is a table, or table rows fetched by simple index scans using the index when argument is an index


From postgresql docs,

idx_tup_read is number of index entries returned by scans on this index
idx_tup_fetch is number of live table rows fetched by simple index scans using this index

so, the reads are when index gives back position of the row required and fetches are when the index gives back the table rows themselves.