Shown here are TIDs from posting lists from block 1 of index "page_len", an index on the heap relation "page". I have omitted any coverage of other indexes on the same table, since that isn't any more informative -- just duplicates what we see here, in "page_len". So this index page has the following 9 known-corrupt posting list tuples (numbered 1-9 here), whose leaf page offset numbers are: 2,4,7,10,12,14,15,16,17 Most of the corruption is duplication of TIDs in the index. I relate that to the state of the corresponding heap tuple in the table here. Occasionally I note non-duplicate TIDs in the index that point to LP_UNUSED items in the heap, which is of course totally wrong too. (It's possible that I missed some corruption on this same index page, but that seems unlikely to matter -- I definitely got most of it, which is enough.) corrupt posting list in (1,2) starting at postingoff 34/146: <-- posting list tuple #1 0. (0,1) ... , 34. (0,53) <--- this is LP_UNUSED , 35. (0,53) , 36. (0,53) , 37. (0,53) , 38. (0,53) , 39. (0,54) <-- also LP_UNUSED , 40. (1,1) ... , 91. (2,24) , 92. (2,25) , 93. (2,26) , 94. (2,27) , 95. (2,28) <-- xmin+xmax: 1771473 (2,28) t_infomask (HEAP_HASNULL|HEAP_HASVARWIDTH|HEAP_XMAX_KEYSHR_LOCK|HEAP_XMAX_LOCK_ONLY|HEAP_XMIN_COMMITTED|HEAP_XMAX_INVALID|HEAP_UPDATED) , 96. (2,28) , 97. (2,28) ... corrupt posting list in (1,4) starting at postingoff 84/134: <-- posting list tuple #2 0. (3,31) ... , 84. (5,46) <--- xmax: 343993, (5,46) t_infomask (HEAP_HASNULL|HEAP_HASVARWIDTH|HEAP_XMAX_KEYSHR_LOCK|HEAP_XMAX_LOCK_ONLY|HEAP_XMIN_COMMITTED|HEAP_XMAX_INVALID|HEAP_UPDATED) , 85. (5,46) ... XXX Is heap TID (7,39) somewhere in same index page? Because it's LP_REDIRECT to (7,58), which has xmin+xmax of 365637 -- this XID is known to be a corrupter of data corrupt posting list in (1,7) starting at postingoff 30/137: <-- posting list tuple #3 0. (7,4) ... , 29. (7,47) , 30. (7,47) <--- xmin + xmax: 1824392 (7,47) t_infomask (HEAP_HASNULL|HEAP_HASVARWIDTH|HEAP_XMAX_KEYSHR_LOCK|HEAP_XMAX_LOCK_ONLY|HEAP_XMIN_COMMITTED|HEAP_XMAX_INVALID|HEAP_UPDATED) , 31. (7,49) <--- xmin + xmax: 1338281 (7,49) t_infomask (HEAP_HASNULL|HEAP_HASVARWIDTH|HEAP_XMAX_KEYSHR_LOCK|HEAP_XMAX_LOCK_ONLY|HEAP_XMIN_COMMITTED|HEAP_XMAX_INVALID|HEAP_UPDATED) , 32. (7,49) , 33. (7,52) , 71. (8,41) , 72. (8,41) <--- actually just LP_DEAD , 73. (8,41) , 74. (8,42) <-- LP_REDIRECT to 57, which is xmin+xmax 434522, (8,57) t_infomask (HEAP_HASNULL|HEAP_HASVARWIDTH|HEAP_XMAX_KEYSHR_LOCK|HEAP_XMAX_LOCK_ONLY|HEAP_XMIN_COMMITTED|HEAP_XMAX_INVALID|HEAP_UPDATED) , 75. (8,42) , 76. (8,43) ... corrupt posting list in (1,10) starting at postingoff 99/141: <-- posting list tuple #4 0. (10,7) ... , 98. (12,39) , 99. (12,39) <--- (12,39) t_infomask (HEAP_HASNULL|HEAP_HASVARWIDTH|HEAP_XMAX_KEYSHR_LOCK|HEAP_XMAX_LOCK_ONLY|HEAP_XMIN_COMMITTED|HEAP_XMAX_INVALID|HEAP_UPDATED) xmin: 365637 xmax: 365637 , 100. (12,39) , 101. (12,39) , 102. (12,39) , 103. (12,41) , 104. (12,42) , 105. (12,45) , 106. (12,46) <-- actually an LP_UNUSED item in heap (incidentally, 12,49 is LP_REDIRECT in heap) , 107. (12,50) , 108. (12,51) , 109. (12,52) , 110. (12,54) , 111. (12,56) <--- xmin + xmax: 365637 (12,56) t_infomask (HEAP_HASNULL|HEAP_HASVARWIDTH|HEAP_XMAX_KEYSHR_LOCK|HEAP_XMAX_LOCK_ONLY|HEAP_XMIN_COMMITTED|HEAP_XMAX_INVALID|HEAP_UPDATED) , 112. (12,56) , 113. (13,1) , 114. (13,2) , 115. (13,4) corrupt posting list in (1,12) starting at postingoff 34/133: <-- posting list tuple #5 0. (13,37) ... , 32. (14,19) , 33. (14,20) , 34. (14,20) <--- xmin: 1825644, xmax: 1825644, (14,20) t_infomask (HEAP_HASNULL|HEAP_HASVARWIDTH|HEAP_XMAX_KEYSHR_LOCK|HEAP_XMAX_LOCK_ONLY|HEAP_XMIN_COMMITTED|HEAP_XMAX_INVALID|HEAP_UPDATED) , 35. (14,23) , 36. (14,24) , 37. (14,25) ... corrupt posting list in (1,14) starting at postingoff 6/139: <-- posting list tuple #6 ... , 2. (16,38) , 3. (16,39) , 4. (16,40) , 5. (16,42) , 6. (16,42) <-- xmin+xmax both 365637, (16,42) t_infomask (HEAP_HASNULL|HEAP_HASVARWIDTH|HEAP_XMAX_KEYSHR_LOCK|HEAP_XMAX_LOCK_ONLY|HEAP_XMIN_COMMITTED|HEAP_XMAX_INVALID|HEAP_UPDATED) , 7. (16,42) , 8. (16,42) , 9. (16,43) , 10. (16,44) <-- LP_UNUSED in heap , 11. (16,47) , 12. (16,48) , 13. (16,49) , 14. (16,51) , 15. (16,54) , 16. (16,56) ... , 131. (19,34) , 132. (19,35) , 133. (19,36) , 134. (19,37) , 135. (19,39) , 136. (19,40) <-- xmin+xmax: 365637, (19,40) t_infomask (HEAP_HASNULL|HEAP_HASVARWIDTH|HEAP_XMAX_KEYSHR_LOCK|HEAP_XMAX_LOCK_ONLY|HEAP_XMIN_COMMITTED|HEAP_XMAX_INVALID|HEAP_UPDATED) , 137. (19,40) , 138. (19,40) corrupt posting list in (1,15) starting at postingoff 48/138: <-- posting list tuple #7 0. (19,40) , 1. (19,43) , 46. (20,38) , 47. (20,41) , 48. (20,41) <--- xmin+xmax 1551639, (20,41) t_infomask (HEAP_HASNULL|HEAP_HASVARWIDTH|HEAP_XMAX_KEYSHR_LOCK|HEAP_XMAX_LOCK_ONLY|HEAP_XMIN_COMMITTED|HEAP_XMAX_INVALID|HEAP_UPDATED) , 49. (20,42) , 50. (20,43) ... , 70. (21,14) , 71. (21,15) , 72. (21,16) <-- xmin: 365637, xmax:365637, (21,16) t_infomask (HEAP_HASNULL|HEAP_HASVARWIDTH|HEAP_XMAX_KEYSHR_LOCK|HEAP_XMAX_LOCK_ONLY|HEAP_XMIN_COMMITTED|HEAP_XMAX_INVALID|HEAP_UPDATED) , 73. (21,16) , 74. (21,16) , 75. (21,17) ... , 93. (21,39) , 94. (21,40) , 95. (21,41) <-- FWIW (21,40) is LP_DEAD in heap, but this is just LP_NORMAL <-- (21,41) t_infomask (HEAP_HASNULL|HEAP_HASVARWIDTH|HEAP_XMAX_KEYSHR_LOCK|HEAP_XMAX_LOCK_ONLY|HEAP_XMIN_COMMITTED|HEAP_XMAX_INVALID|HEAP_UPDATED) (21,41) xmin: 365637 (21,41) xmax: 365637 , 96. (21,41) , 97. (21,42) , 98. (21,43) , 99. (21,44) ... , 131. (22,29) , 132. (22,30) , 133. (22,31) , 134. (22,33) <- LP_REDIRECT to (22,41) , 135. (22,34) , 136. (22,35) , 137. (22,36) corrupt posting list in (1,16) starting at postingoff 2/139: <-- posting list tuple #8 0. (22,37) , 1. (22,39) , 2. (22,39) <--- xmin/xmax 365637, (22,39) t_infomask (HEAP_HASNULL|HEAP_HASVARWIDTH|HEAP_XMAX_KEYSHR_LOCK|HEAP_XMAX_LOCK_ONLY|HEAP_XMIN_COMMITTED|HEAP_XMAX_INVALID|HEAP_UPDATED) , 3. (22,39) , 4. (22,40) htid 22,41 not in index, whose xmin + xmax are both 1718382, plus: (22,41) t_infomask (HEAP_HASNULL|HEAP_HASVARWIDTH|HEAP_XMAX_KEYSHR_LOCK|HEAP_XMAX_LOCK_ONLY|HEAP_XMIN_COMMITTED|HEAP_XMAX_INVALID|HEAP_UPDATED) XXX: Actually, heap TID 22,41 is effectively "in the index", because heap tid 22,33 is on same index page, and in the heap page we see it's LP_REDIRECT to 22,41 , 5. (22,42) , 6. (22,43) , 7. (22,44) , 8. (22,45) , 9. (22,46) ... , 44. (23,30) , 45. (23,33) <-- LP_UNUSED in heap , 46. (23,34) , 47. (23,35) , 48. (23,35) , 49. (23,35) , 50. (23,35) <-- xmin+xmax both 1475767, (23,35) t_infomask (HEAP_HASNULL|HEAP_HASVARWIDTH|HEAP_XMAX_KEYSHR_LOCK|HEAP_XMAX_LOCK_ONLY|HEAP_XMIN_COMMITTED|HEAP_XMAX_INVALID|HEAP_UPDATED) , 51. (23,35) , 52. (23,36) , 53. (23,41) ... corrupt posting list in (1,17) starting at postingoff 37/139: <-- posting list tuple #9 0. (25,35) ... , 36. (26,27) , 37. (26,27)<--- , 38. (26,27) <--- (26,27) t_infomask (HEAP_HASNULL|HEAP_HASVARWIDTH|HEAP_XMAX_KEYSHR_LOCK|HEAP_XMAX_LOCK_ONLY|HEAP_XMIN_COMMITTED|HEAP_XMAX_INVALID|HEAP_UPDATED) xmin: 365638 xmax: 365638 , 39. (26,28) , 40. (26,30) , 41. (26,31) , 42. (26,35) , 43. (26,36) ... , 95. (27,46) , 96. (27,47) , 97. (27,47) <--- xmin+xmax both 1613467, (27,47) t_infomask (HEAP_HASNULL|HEAP_HASVARWIDTH|HEAP_XMAX_KEYSHR_LOCK|HEAP_XMAX_LOCK_ONLY|HEAP_XMIN_COMMITTED|HEAP_XMAX_INVALID|HEAP_UPDATED) , 98. (27,47) , 99. (27,47) , 100. (27,47) ...