PG通过表访问方法API如何执行顺序扫描
引言
PG中有很多方法检索数据并返回给用户。依赖于用户的SQL语句,查询计划模块生成最有方法以检索请求的数据。顺序扫描是用户请求大量数据时或者当表没有索引时使用的一种检索方法(例如select * from tablename;);顺序扫描方法由表的表访问方法APIchuli,heap表访问方法时当前版本中默认的方法。本文中,将会介绍表访问方法API如何进行顺序扫描。
PG中表访问方法APIs
PG12中引入了可拔插表访问方法,允许开发者重定义存储/检索表数据的方法。这个API包含42个函数。定义在tableam.h中,这些接口函数在typedef struct TableAmRoutine中。下面介绍关于顺序扫描的routine,帮助开发这了解如何创建自己的表访问方法。
顺序扫描的调用栈
42个routines中很少由一个会被执行器调用来完成顺序扫描的请求。本节按调用顺序描述这些接口。
relation_size
函数声明:uint64 (*relation_size) (Relation rel, ForkNumberforkNumber);
Relation_size函数是第一个被调用的函数,相对简单。通过rel和forkNumber,返回对于文件的大学。默认heap表访问方法会调用存储管理器smgr,计算出对于表文件的页数,然后成语每个页大小BLCKSZ默认8KB。如果不确定表和forknumber之间的关系,可以查询网址https://www.highgo.ca/2020/10/23/free-space-mapping-file-in-details/了解更多信息。
返回的大小设置顺序扫描的边界。