Postgresql Postgres和tables内部组织
我在postgresql中找到了内部工作原理的解释。照片如下: 并作出以下解释: 标题后的项是由(偏移量、, 长度)指向实际项目的对 由于项标识符在释放之前不会移动,因此其索引 可以长期用于引用项目,即使 项目本身在页面上移动以压缩可用空间。A. 指向项的指针称为CTID(ItemPointer),由 PostgreSQL,它由页码和项目索引组成 标识符 你能帮我把这里的一些事情弄清楚吗Postgresql Postgres和tables内部组织,postgresql,Postgresql,我在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
是存储在索引中的内容。声明现在应该清楚了