gp(pg)中元组列的访问

gp(pg)中元组列的访问
假设要取元组的第10列:

  1. 先用bitmap去检查前9列是否有空
    (即第1个byte,和第二个byte的低1位是否有0,0表示空列)
  2. 取出元组offset的位置(第一个数据开始的位置)
  3. 检查元组descriptor中,如果前9列没有null列,且属于定长列(定长列判断是先看infomask中有一个HEAP_HASVARWIDTH标记,然后之前缓存的前9列的cachedoffset都大于0(-1表示变长列))
  4. 如果满足3,则可以直接计算出第10列的位置
  5. 如果不满足3或者这是第一次访问这个表(还没缓存),就只能一列一列去计算长度了(并缓存下来供下一次用(cachedoffset))。
  6. 这里缓存的只是定长列,每次不满足3时,实际是从满足非空定长的列开始计算偏移位置的。比如1-4列定长5列为null,6-8为定长,这时就只缓存到1-4的位置。找下个元组发现1-8均非null,就从5位开始把5-8偏移位置缓存下来。如果下一行3位为null,就从第3列位置开始找到第10列的位置,且这中间的3-8列长度缓存不会被修改。第9列由于是变长,缓存中这一列的长度永远是-1,所以9列后的每一列的偏移都不会被缓存
  7. 元组列是按先定长,再变长的顺序组织的。
  8. 找列长度时要计算字节对齐,每列的对齐长度在descriptor中的align属性中有记录