PG通过表访问方法API如何执行顺序扫描

简介: PG通过表访问方法API如何执行顺序扫描

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/了解更多信息。

返回的大小设置顺序扫描的边界。


slot_callbacks


函数声明:const TupleTableSlotOps*(*slot_callbacks) (Relation rel);

下一步,执行器需要找出此表访问方法与哪一个tuple table slot(TTS)回调操作的集合兼容。TTS是routines集合,确保tuple存储在执行器和访问方法之间兼容。执行器执行TTS回调以TupleTableSlot结构传输tuple,该结构执行器可以认识。默认的heap访问方法使用execTuples.c中定义的TTSOpsBufferHeapTuple来处理这个操作。


scan_begin


函数声明:TableScanDesc (*scan_begin) (Relationrel,

                                Snapshotsnapshot,

                                int nkeys,struct ScanKeyData *key,

                               ParallelTableScanDesc pscan,

                               uint32flags);

现在可以开始扫描。这个函数是顺序扫描的初始化函数,将使用执行器传输的参数分配一个新的scan描述符。Scan描述符结构的目的在于执行顺序扫描时进行跟踪。例如,要跟踪从哪里开始扫描,上次扫描块号是什么时候,应该回复扫描哪个块,以及扫描了多少块等等。一旦顺序扫描完成,scan描述符会被销毁。

执行器希望接口返回指向TableScanDesc结构的指针。


scan_getnextslot


函数声明:bool        (*scan_getnextslot) (TableScanDescscan,

                                    ScanDirection direction,

                                   TupleTableSlot *slot);

这个函数是顺序扫描的主要函数,从buffer管理器中获取一个tuple,转换成TTS格式并将它存储到slot指针中。每次调用返回一个tuple。如果表由1000个tuple,这个函数会调用1000次。返回true表示需要再次调用获取下一个tuple,返回false表示获取了所有元组,不用再调用这个函数了。

通常情况下顺序扫描以per-page模式进行工作。也就是说从buffer管理器中加载并读入一个block到内存,然后从这个页中一个元组一个元组地进行返回,获取完一页,再加载另一页进行扫描。

Scan描述符起着重要作用,因为这个结构体中存有大量控制信息,调用scan_getnextslot会更新。

scan_end


函数声明:void        (*scan_end) (TableScanDesc scan);

顺序扫描调用的最后一个函数,用于清理scan描述符。此时执行器已经通过顺序扫描方法获取了所有元组信息。


准备返回的数据


现在执行器通过表访问方法扫描了所有元组,需要进入过滤流程决定哪些元组符合返回的条件(例如使用WHERE限制扫描结果)。由execScan.c中的for循环在每个TTS上执行ExecQual,最终结果发送给用户。


总结


流程图如下:


原文

https://www.highgo.ca/2021/01/15/how-postgresql-executes-sequential-scans-with-the-help-of-table-access-methods-apis/

目录
相关文章
|
4月前
|
自然语言处理 算法 Java
地址描述转换为坐标点不使用API,有什么转换的方法?
地址描述转换为坐标点不使用API,有什么转换的方法?
361 64
|
13天前
|
API 数据安全/隐私保护 UED
探索鸿蒙的蓝牙A2DP与访问API:从学习到实现的开发之旅
在掌握了鸿蒙系统的开发基础后,我挑战了蓝牙功能的开发。通过Bluetooth A2DP和Access API,实现了蓝牙音频流传输、设备连接和权限管理。具体步骤包括:理解API作用、配置环境与权限、扫描并连接设备、实现音频流控制及动态切换设备。最终,我构建了一个简单的蓝牙音频播放器,具备设备扫描、连接、音频播放与停止、切换输出设备等功能。这次开发让我对蓝牙技术有了更深的理解,也为未来的复杂项目打下了坚实的基础。
99 58
探索鸿蒙的蓝牙A2DP与访问API:从学习到实现的开发之旅
|
3月前
|
测试技术 API 项目管理
API测试方法
【10月更文挑战第18天】API测试方法
70 1
|
5月前
|
JSON API 开发工具
【Azure 应用服务】调用Azure REST API来获取 App Service的访问限制信息(Access Restrictions)以及修改
【Azure 应用服务】调用Azure REST API来获取 App Service的访问限制信息(Access Restrictions)以及修改
|
1月前
|
JSON 安全 API
Python调用API接口的方法
Python调用API接口的方法
207 5
|
2月前
|
负载均衡 数据可视化 API
像素流送api ue多人访问需要什么显卡服务器
本文总结了关于像素流送技术的五大常见问题,包括是否支持Unity模型推流、UE多人访问的最大并发数、所需服务器配置、稳定性问题及API支持情况,旨在帮助开发者更好地理解和应用这一技术。
60 1
|
2月前
|
API
如何申请微店的API访问权限?
申请微店API访问权限需先注册账号并完成实名认证,随后提交开发申请,学习API接口,实现功能和数据传输,申请授权获取API Key,测试接口,最后正式上线并持续维护优化。
|
3月前
|
Java 大数据 API
别死脑筋,赶紧学起来!Java之Steam() API 常用方法使用,让开发简单起来!
分享Java Stream API的常用方法,让开发更简单。涵盖filter、map、sorted等操作,提高代码效率与可读性。关注公众号,了解更多技术内容。
127 5
|
3月前
|
编解码 中间件 API
API实现跨平台访问的方式
【10月更文挑战第16天】API实现跨平台访问的方式
59 2
|
2月前
|
Web App开发 API Windows
取接口访问者信息[IP,浏览器,操作系统]免费API接口教程
此API用于获取访问者的IP地址、浏览器和操作系统信息,支持70多种浏览器和操作系统。通过POST或GET请求至`https://cn.apihz.cn/api/ip/getapi.php`,需提供用户ID和KEY。返回结果包括状态码、消息、IP、浏览器和操作系统信息。示例:{"code":200,"ip":"175.154.88.178","browser":"Chrome","os":"Windows 10"}。详情见官网文档。

相关课程

更多