开发者社区> 问答> 正文

postgresql索引存的是oid和值么

已解决

oracle索引中存储的是rowid和值。在postgresql中,OID(对象标识符)用来在整个数据库集簇中唯一地标识一个数据库对象,这个数据库对象可以是数据库、表、索引、视图、类型等。是不是相当于oracle的rowid?不知道pg的索引存的是不是oid和值?望解惑,谢谢!

展开
收起
擎雨 2015-12-22 16:55:49 4086 0
1 条回答
写回答
取消 提交回答
  • 公益是一辈子的事, I am digoal, just do it. 阿里云数据库团队, 擅长PolarDB, PostgreSQL, DuckDB, ADB等, 长期致力于推动开源数据库技术、生态在中国的发展与开源产业人才培养. 曾荣获阿里巴巴麒麟布道师称号、2018届OSCAR开源尖峰人物.
    采纳回答

    存的是ctid, 以及索引字段的值。
    ctid包含了blockID, itemID的信息,检索到块,从而检索到块的linepoint,linepoint记录了行在块内的OFFSET,最终检索到行。

    用pageinspect可以观察到。
    例如:

    postgres=# select * fro m bt_page_items('idx_t',100);
     itemoffset |   ctid    | itemlen | nulls | vars |          data           
    ------------+-----------+---------+-------+------+-------------------------
              1 | (160,75)  |      16 | f     | f    | 8b 8d 00 00 00 00 00 00
              2 | (158,161) |      16 | f     | f    | 1d 8c 00 00 00 00 00 00
              3 | (158,162) |      16 | f     | f    | 1e 8c 00 00 00 00 00 00
              4 | (158,163) |      16 | f     | f    | 1f 8c 00 00 00 00 00 00
              5 | (158,164) |      16 | f     | f    | 20 8c 00 00 00 00 00 00
              6 | (158,165) |      16 | f     | f    | 21 8c 00 00 00 00 00 00
              7 | (158,166) |      16 | f     | f    | 22 8c 00 00 00 00 00 00
              8 | (158,167) |      16 | f     | f    | 23 8c 00 00 00 00 00 00
              9 | (158,168) |      16 | f     | f    | 24 8c 00 00 00 00 00 00
             10 | (158,169) |      16 | f     | f    | 25 8c 00 00 00 00 00 00
             11 | (158,170) |      16 | f     | f    | 26 8c 00 00 00 00 00 00
             12 | (158,171) |      16 | f     | f    | 27 8c 00 00 00 00 00 00
             13 | (158,172) |      16 | f     | f    | 28 8c 00 00 00 00 00 00
             14 | (158,173) |      16 | f     | f    | 29 8c 00 00 00 00 00 00
    2019-07-17 18:20:40
    赞同 2 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
2023云栖大会:和客户一起玩转PolarDB新特性 立即下载
2023云栖大会:PolarDB for AI 立即下载
2023云栖大会:AnalyticDB PostgreSQL 立即下载