postgresql存储引擎源码分析四

前端之家收集整理的这篇文章主要介绍了postgresql存储引擎源码分析四前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

上一次对bufpage.c文件已经分析了一大半了,今天这里准备对这个文件里面剩余的函数分析完全。

下一个函数,我们先来看看它的声明:Size PageGetExactFreeSpace(Page page)。这个函数功能是返回页面page已经分配的空余大小空间,这个与昨天分析的函数PageGetExacFreeSpace函数的区别是它返回的space并不扣除一个ItemIdData的存储空间。

接下来的函数声明:Size PageGetHeapFreeSpace(Page page),从它的声明可以看出,它同样也是返回页面page的空余空间大小。但是它与前面的函数的区别在于:它返回的是以堆形式存储的页面空余大小,它的注释写到:“函数与PageGetFreeSpace函数的区别是,如果在页面中的元组数达到MaxHeapTuplesPerPage宏的话,而且没有空余,这个函数会返回0。”MaxHeapTuplesPerPage宏定义在src\include\access\htup.h头文件中,我们可以知道它是存取系统中的部分,它的定义代码如下:

#define MaxHeapTuplesPerPage \
((int) ((BLCKSZ - SizeOfPageHeaderData) / \
(MAXALIGN(offsetof(HeapTupleHeaderData,t_bits)) + sizeof(ItemIdData))))

BLCKSZ表示一个页面的大小,默认为8K,HeapTupleHeaderData是一个结构体,这个宏返回的是一个堆页面最多拥有的元组的数目。这里很多关系到存取层方面的内容,我们在以以后再详细分析。

我们接着再看这个函数,首先调用 PageGetFreeSpace函数返回page的空余空间大小,如果有空余空间,先取得当前页面page的元组项的最大偏移量,接着遍历所有的元组项找到最后一个未使用的元组的偏移量,如果这个偏移量大于元组项的偏移量,说明出错,返回0,否则返回原来的space大小。

下一个函数的声明,void PageIndexTupleDelete(Page page,OffsetNumber offnum),这个函数功能删除页面page(存储的是索引元组)删除offnum处的元组项item,首先检查这个页面与偏移量offnum是否合法,如果不合法,报错,函数退出。再从page中取得offnum位置的元组项,如果该元组项已经存储在物理设备上,如果为真,函数退出。接着,定义一个变量nbytes计算这个元组项之前所有的元组项调用memmove函数将page的pd_linp数组往前移动一个位置,完成删除操作。下面就要移动空余空间的内容了,同样是调用memmove函数。接着调整page的其他参数,最后调整删除元组项之前所有元组的偏移量。结束,函数退出。 最后一个函数:void PageIndexMultiDelete(Page page,OffsetNumber *itemnos,int nitems),这个函数与上面的函数类似,区别就是这次是批量删除删除页面page中的itemnos数组。数组长度为nitems,如果nitems不大于2的话,便直接用一个循环调用上面的PageIndexTupleDelete函数删除,完成操作。否则首先检查页面是否有效,无效的话报错,函数退出。接着,定义一个上一次所说的itemIdSort数组itemidbase作为辅助空间,为后面的排序做准备。接着遍历所有的元组项,用一个变量nextitm来记录元组中itemnos数组中元组的数量,如果元组不位于数组中,将该数组赋值于itemidbase,nused变量自增1,同上一次所分析的类似,首先对itemidbase数组按偏移量降序排序,然后同前一次的PageRepairFragmentation函数对元组项做“紧凑”操作,由于之前要删除的元组未保存在itemidbase数组中,这样就可以删除这些元组达到所需要的功能,最后重置pd_lower,pd_upper参数,释放itemidbase数组空间,函数结束。 至此,我们已将bufpage.c文件分析完毕,接下来的工作仍然繁重,希望大家给出建议,改正。 姓名:鲁笛 主题页面存储

原文链接:https://www.f2er.com/postgresql/194937.html

猜你在找的Postgre SQL相关文章