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/

目录
相关文章
|
6月前
|
缓存 负载均衡 监控
微服务架构下的电商API接口设计:策略、方法与实战案例
本文探讨了微服务架构下的电商API接口设计,旨在打造高效、灵活与可扩展的电商系统。通过服务拆分(如商品、订单、支付等模块)和标准化设计(RESTful或GraphQL风格),确保接口一致性与易用性。同时,采用缓存策略、负载均衡及限流技术优化性能,并借助Prometheus等工具实现监控与日志管理。微服务架构的优势在于支持敏捷开发、高并发处理和独立部署,满足电商业务快速迭代需求。未来,电商API设计将向智能化与安全化方向发展。
441 102
|
3月前
|
人工智能 API 开发者
图文教程:阿里云百炼API-KEY获取方法,亲测全流程
本文详细介绍了如何获取阿里云百炼API-KEY,包含完整流程与截图指引。需先开通百炼平台及大模型服务,再通过控制台创建并复制API-KEY。目前平台提供千万tokens免费额度,适合开发者快速上手使用。
2702 5
|
10月前
|
JSON 数据可视化 API
Python 中调用 DeepSeek-R1 API的方法介绍,图文教程
本教程详细介绍了如何使用 Python 调用 DeepSeek 的 R1 大模型 API,适合编程新手。首先登录 DeepSeek 控制台获取 API Key,安装 Python 和 requests 库后,编写基础调用代码并运行。文末包含常见问题解答和更简单的可视化调用方法,建议收藏备用。 原文链接:[如何使用 Python 调用 DeepSeek-R1 API?](https://apifox.com/apiskills/how-to-call-the-deepseek-r1-api-using-python/)
|
自然语言处理 算法 Java
地址描述转换为坐标点不使用API,有什么转换的方法?
地址描述转换为坐标点不使用API,有什么转换的方法?
718 64
|
测试技术 API 项目管理
API测试方法
【10月更文挑战第18天】API测试方法
369 1
|
12月前
|
API 数据安全/隐私保护 UED
探索鸿蒙的蓝牙A2DP与访问API:从学习到实现的开发之旅
在掌握了鸿蒙系统的开发基础后,我挑战了蓝牙功能的开发。通过Bluetooth A2DP和Access API,实现了蓝牙音频流传输、设备连接和权限管理。具体步骤包括:理解API作用、配置环境与权限、扫描并连接设备、实现音频流控制及动态切换设备。最终,我构建了一个简单的蓝牙音频播放器,具备设备扫描、连接、音频播放与停止、切换输出设备等功能。这次开发让我对蓝牙技术有了更深的理解,也为未来的复杂项目打下了坚实的基础。
509 58
探索鸿蒙的蓝牙A2DP与访问API:从学习到实现的开发之旅
|
9月前
|
API
钉钉宜搭--远程API,在其他人访问时无法生效
简介: 描述了一种远程API配置问题的场景。开发人员在本地可正常通过应用表单获取数据,但同组织的其他同事访问时无法获取数据,尽管已设置全部权限。问题是关于如何解决这种跨用户数据访问异常的情况,确保同事间能正常共享数据。
|
JSON 安全 API
Python调用API接口的方法
Python调用API接口的方法
1743 5
|
负载均衡 数据可视化 API
像素流送api ue多人访问需要什么显卡服务器
本文总结了关于像素流送技术的五大常见问题,包括是否支持Unity模型推流、UE多人访问的最大并发数、所需服务器配置、稳定性问题及API支持情况,旨在帮助开发者更好地理解和应用这一技术。
473 1
|
Java 大数据 API
别死脑筋,赶紧学起来!Java之Steam() API 常用方法使用,让开发简单起来!
分享Java Stream API的常用方法,让开发更简单。涵盖filter、map、sorted等操作,提高代码效率与可读性。关注公众号,了解更多技术内容。
565 5