Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Postgres和tables内部组织_Postgresql - Fatal编程技术网

Postgresql Postgres和tables内部组织

Postgresql Postgres和tables内部组织,postgresql,Postgresql,我在postgresql中找到了内部工作原理的解释。照片如下: 并作出以下解释: 标题后的项是由(偏移量、, 长度)指向实际项目的对 由于项标识符在释放之前不会移动,因此其索引 可以长期用于引用项目,即使 项目本身在页面上移动以压缩可用空间。A. 指向项的指针称为CTID(ItemPointer),由 PostgreSQL,它由页码和项目索引组成 标识符 你能帮我把这里的一些事情弄清楚吗 页面标题附近的项目是CTID本身,还是项目和CTID是不同的东西 CTID是否从不四处移动或成排移动 根据

我在postgresql中找到了内部工作原理的解释。照片如下:

并作出以下解释:

标题后的项是由(偏移量、, 长度)指向实际项目的对

由于项标识符在释放之前不会移动,因此其索引 可以长期用于引用项目,即使 项目本身在页面上移动以压缩可用空间。A. 指向项的指针称为CTID(ItemPointer),由 PostgreSQL,它由页码和项目索引组成 标识符

你能帮我把这里的一些事情弄清楚吗

  • 页面标题附近的项目是CTID本身,还是项目和CTID是不同的东西
  • CTID是否从不四处移动或成排移动
  • 根据答案,也许我会理解下面的确切含义:“因为项目标识符在释放之前是不会移动的,所以它的索引可以长期用于引用项目,即使项目本身在页面上移动以压缩可用空间。” 然而,额外的更详细的解释会更好

  • 图中所谓的“项”是PostgreSQL术语中的“行指针”。定义如下:

    /*
    *缓冲页上的行指针。请参阅缓冲页定义和注释
    *有关如何使用行指针的说明。
    *
    *在某些情况下,行指针“正在使用”,但没有任何关联的
    *存储在页面上。按照惯例,每行指针中的lp_len==0
    *它没有存储,与它的lp_标志状态无关。
    */
    typedef结构ItemIdData
    {
    无符号lp_off:15,/*到元组的偏移量(从页面开始)*/
    lp_标志:2、/*行指针状态,见下文*/
    lp_len:15;/*元组的字节长度*/
    }ItemIdData;
    typedef ItemIdData*ItemId;
    
    这些行指针存储在页眉后面的数组中

    请参阅中的优秀文档:

    /*
    *postgres磁盘页是在postgres上分层的抽象
    *磁盘块(它只是一个i/o单元,请参见block.h)。
    *
    *具体来说,虽然磁盘块可以不格式化,但postgres
    *磁盘页始终是以下格式的开槽页:
    *
    * +----------------+---------------------------------+
    *| PageHeaderData | linp1 linp2 linp3|
    * +-----------+----+---------------------------------+
    * | ... 林普宁|
    * +-----------+--------------------------------------+
    *| ^pd_较低|
    * |                                                  |
    *| v pd_上部|
    * +-------------+------------------------------------+
    *| |图普伦|
    * +-------------+------------------+-----------------+
    * |       ... tuple3 tuple2 tuple1 |“特殊空间”|
    * +--------------------------------+-----------------+
    *^pd\U特别版
    *
    *注:
    *
    *linp1..N形成一个ItemId(行指针)数组。项目指针点
    *到物理块号和逻辑偏移量(行指针
    *编号)在该块/页内。请注意,OffsetNumber
    *通常从1开始,而不是0。
    *
    *元组1..N在页面上添加“向后”。因为一个项目指针
    *偏移量用于访问ItemId条目,而不是实际的
    *字节偏移位置,元组可以在页面上进行物理洗牌
    *每当需要的时候。这种间接方式还可以保持崩溃恢复
    *相对简单,因为页面空间的低级细节
    *管理可在运行期间通过标准缓冲区页面代码进行控制
    *日志记录和恢复期间。
    
    您问题的答案:

  • 元组的
    ctid
    是物理地址,由块号(从0开始)和行指针(从1开始)组成。您可以从表行的
    ctid
    中识别行指针:它是第二个数字。例如,
    (321,5)
    将是322页上的第五行指针

  • 块中实际元组的位置不是固定的:它存储在
    lp\u off
    中。这允许PostgreSQL在块中移动数据,而无需更改元组的物理地址(
    tid
    )。直线指针本身永远不会改变

  • 如上所述,实际数据可以在块中移动,但行指针不会改变。元组的
    ctid
    是存储在索引中的内容。声明现在应该清楚了