Why is there a heap_tid, We haven’t inserted the value, so where does it from ?
Index insertion only happens after the TableAM tuple has been inserted. As indexes refer to locations in the heap, this TID contains the TID of the table tuple that contains the indexed values, so that the index knows which tuple to refer to.
Note that access/amapi.h describes only index AM APIs; it does not cover the table AM APIs descibed in access/tableam.h
Kind regards,
Matthias van de Meent
1.Thanks, so if we insert a tuple into a table which has a index on itself, pg will insert tuple into heap firstly, and the give the heaptid form heap to the Index am api right?
Correct. I think this is also detailed in various places of the documentation, yes.
2. I’m trying to implement a new index, but I just need the data held in index table, I hope it’s not inserted into heap, because the all data I want can be in index table.
In PostgreSQL, a table maintains the source of truth for the data, and indexes are ephemeral data structures that improve the speed of querying the data in their table. As such, dropping an index should not impact the availability of the table's data. If the only copy of your (non-derived) data is in the index, then it is likely that some normal table operations will result in failures due to the tableAM/indexAM breaking built-in assumptions about access methods and data availability.