PostgreSQL数据库查询执行——SeqScan节点执行

news2025/1/9 14:33:55

SeqScan节点代码处于src/backend/executor/nodeSeqscan.c文件中,包含了4个重要函数:ExecInitSeqScan、ExecSeqScan、ExecReScanSeqScan和 ExecEndSeqScan。

ExecInitSeqScan

请添加图片描述
src/backend/executor/nodeSeqscan.c文件中的ExecInitSeqScan函数,其主要包含如下步骤,如上图红色所标出:

  • 创建SeqScanState结构体,关联执行计划树上的SeqScan节点,关联estate
  • 创建expression context
  • 打开scan relation,根据行类型创建合适的槽(PostgreSQL数据库TableAM——HeapAM TupleTableSlot类型中描述了src/backend/access/table/tableam.c向外部模块提供了table_slot_callbacks函数用于获取tableAM创建的表适合的数据tuple存储槽),并将槽关联到estate的es_tupleTable List中
  • 初始化结果类型和投影
  • 初始化child experssions
SeqScanState *ExecInitSeqScan(SeqScan *node, EState *estate, int eflags){
	/* create state structure */
	SeqScanState *scanstate = makeNode(SeqScanState);
	scanstate->ss.ps.plan = (Plan *) node; scanstate->ss.ps.state = estate; scanstate->ss.ps.ExecProcNode = ExecSeqScan;
	/* create expression context for node */
	ExecAssignExprContext(estate, &scanstate->ss.ps);
	/* open the scan relation */
	scanstate->ss.ss_currentRelation = ExecOpenScanRelation(estate, node->scanrelid, eflags);
	/* and create slot with the appropriate rowtype */
	ExecInitScanTupleSlot(estate, &scanstate->ss, RelationGetDescr(scanstate->ss.ss_currentRelation), table_slot_callbacks(scanstate->ss.ss_currentRelation));

	/* Initialize result type and projection. */
	ExecInitResultTypeTL(&scanstate->ss.ps);
	ExecAssignScanProjectionInfo(&scanstate->ss);
	/* initialize child expressions */
	scanstate->ss.ps.qual = ExecInitQual(node->plan.qual, (PlanState *) scanstate);

	return scanstate;
}

ExecSeqScan

ExecSeqScan函数顺序扫描表,返回下一个合适的元组。ExecScan函数会调用SeqNext函数,该函数是真正从表中获取元组的工作函数。

/* ----------------------------------------------------------------
 *		ExecSeqScan(node)
 *		Scans the relation sequentially and returns the next qualifying
 *		tuple.
 *		We call the ExecScan() routine and pass it the appropriate
 *		access method functions.
 * ----------------------------------------------------------------
 */
static TupleTableSlot *ExecSeqScan(PlanState *pstate){
	SeqScanState *node = castNode(SeqScanState, pstate);
	return ExecScan(&node->ss,  (ExecScanAccessMtd) SeqNext,  (ExecScanRecheckMtd) SeqRecheck);
}

SeqNext会做三件事:1. 如果不存在scandesc则创建并初始化一个scandesc(这在顺序扫描中会发生,显而易见的是懒加载,只有真正执行时才创建,但是在并行seqscan中,在Gather节点执行函数ExecGather/ExecGatherMerge中的ExecInitParallelPlanExecSeqScanInitializeDSM函数会调用了TableAM提供的table_beginscan_parallel函数,该函数会初始化ParallelTableScanDescData结构体,并调用TableAM begin_scan接口创建TableScanDesc结构体。)由于SeqNext一次只返回一条可见元组,所以需要一个迭代器,用于记录当前遍历到了哪一个缓存页的哪一条元组,scandesc就是这个迭代器。scandesc是一个HeapScanDesc类型的结构体。2. 调用heap_getnext获取一条可见元组,该函数也是全表遍历的一个核心函数,可以参见HeapAM对TableAM的getnextslot的实现。

static TupleTableSlot *SeqNext(SeqScanState *node){
	/* get information from the estate and scan state */
	TableScanDesc scandesc = node->ss.ss_currentScanDesc;
	EState	   *estate = node->ss.ps.state;
	ScanDirection direction = estate->es_direction;
	TupleTableSlot *slot = node->ss.ss_ScanTupleSlot;

	if (scandesc == NULL) { /* We reach here if the scan is not parallel, or if we're serially executing a scan that was planned to be parallel. */
		scandesc = table_beginscan(node->ss.ss_currentRelation, estate->es_snapshot, 0, NULL);
		node->ss.ss_currentScanDesc = scandesc;
	}

	/* get the next tuple from the table */
	if (table_scan_getnextslot(scandesc, direction, slot)) return slot;
	return NULL;
}

https://blog.csdn.net/obvious__/article/details/120706222

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/118552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数智化转型给企业带来了什么?

数智化转型的核心价值之一在于对企业创智型活动的赋能,从用户需求趋势预测到创意快速验证,数智化应用具有巨大的价值前景。 因此,尽管目前数智化研发还存在着一定程度的复杂性高、不确定性大等问题,但因数智化研发所具有极大的潜…

C# 网络信息获取

一 网络信息浏览 1 HTTP协议 2 客户端与服务器 3 Request与Response 4 Stream 5 Get与Post 二 一些查看工具 1 Fiddler2 http://www.fidddler2.com 2 其他工具 如NetworkMoniter、Visula Sniffer、httpwatch、WireShark 3 Chrom/FireFox等浏览器F12 ① Chrome 中按F…

泛微齐业成,一文告诉你如何实现全程数字化的预算管理

新一代全程数字化费控管理软件-齐业成预算管理,实现从预算建模、预算编制、预算审批、预算管控、预算变更、预算分析、预算考评的全程数字化管理。 随着数字经济和数字社会的高速发展,预算管理已成为组织内部最重要的经营管理活动之一,其过程…

MySQL窗口函数 和 阿里云日志留存率统计脚本实现

窗口函数的官方描述:窗口函数对一组查询行执行类似聚合的操作。但是,虽然聚合操作将查询行分组为单个结果行,但窗口函数会为每个查询行生成一个结果,发生函数评估的行称为当前行,与发生函数评估的当前行相关的查询行构…

docker镜像导出和导入

1.容器镜像导出 我们先通过docker images查看需要导出的镜像 然后我们使用镜像导出命令 docker save -o /home/备份包名.tar 镜像id或镜像名 # -o(即output) 或 > 表示输出到文件备份镜像可以同时备份多个,空格分隔,这里建议使用镜像名备份&#xff…

DeepMind:用 GNN 学习通用推理算法

文 | 智商掉了一地小孩子才做选择,我的模型全!都!要!近年来,基于深度神经网络的机器学习系统取得了巨大进步,尤其是在以感知为主的任务上。这一领域表现突出的模型通常要在分布中进行泛化,意味着…

Keras深度学习实战(43)——深度Q学习算法

Keras深度学习实战(43)——深度Q学习算法0. 前言1. Q 学习简介2. 使用 Q 学习进行 FrozenLake 游戏2.1 FrozenLake 环境分析2.2 模型分析2.3 使用 Q 学习算法解决 FrozenLake 问题3. 使用深度 Q 学习进行 CartPole 游戏3.1 问题分析3.2 模型分析3.3 使用…

通讯录怎么恢复?在 手机上检索找回已删除的电话号码的3种方式

不幸的是,我从手机中删除了一些号码,因此它也从帐户中删除了。我想恢复它们或将我的帐户恢复到一周前我拥有这些号码的日期。— 来自 Android 用户 像上述用户一样,您可能已经删除了一些电话号码,但希望有一天能恢复它们。这种事故…

python数据分析及可视化(十八)Power BI(数据获取、整理、清洗以及可视化、Power Query的基本操作、删除及增加列)

Power BI 微软推出的数据分析和可视化工具,用于在组织中提供见解,是商业分析工具,让视觉对象分析触手可及,可以创建交互式数据可视化效果和报表,连接数百个数据源、简化、准备数据等,并提供相应的分析&…

虚拟机Ubuntu设置固定IP与主机相互通讯

虚拟机Ubuntu设置固定IP与主机相互通讯1. 写在最前1.1 最好了解的预备知识1.2 虚拟机与主机三种连接方式1.3 写在最前2. VMware 虚拟机Ubuntu系统与主机共享IP2.1 配置VMware桥接网卡2.2 设置虚拟机为固定IP2.3 Vmware 虚拟机与主机互相通讯3. VirtualBox虚拟机Ubuntu系统与主机…

ContrastMask: Contrastive Learning to Segment Every Thing

摘要 部分监督实例分割是一种通过学习有限的base类和带注释的掩码来从novel类别中分割对象的任务,从而消除了沉重的注释负担。解决这一问题的关键是建立一个有效的类不可知掩码分割模型。与以前只在base类别上学习此类模型的方法不同,在本文中&#xff…

Nginx root 以及alias差别

1. 前言 今天的目的主要是梳理下在 nginx 中 root 以及 alias 在用法上有什么不同。其实这个问题看起来很简单。但是对于前端同学而言还是很困难的,毕竟有的前端同学都没弄过服务器 2. 结论 root 以及 alias 都是对 url 发起根目录进行控制。但是颗粒度有所不同roo…

【深基18.例3】查找文献(C++,图的遍历)

题目描述 小K 喜欢翻看洛谷博客获取知识。每篇文章可能会有若干个(也有可能没有)参考文献的链接指向别的博客文章。小K 求知欲旺盛,如果他看了某篇文章,那么他一定会去看这篇文章的参考文献(如果他之前已经看过这篇参…

JavaScript 中如何代理 Set(集合) 和 Map(映射)

ECMAScript6 中 Set 和 Map 的代理方法上一节:《JavaScript 中如何代理数组 》| 下一节:《JavaScript 中的反射(Reflect)原理与应用 》今日正在编写中,未完待续… jcLee95 邮箱 :291148484163.com CSDN…

Git分支操作

实操记录 假定非管理人员操作: 直推: 新建特性分支cbry: 刷新分支: checkout切换: 本地文件查看: 再merge: 就此,master的代码就合并到特性分支cbry: 新增内容&#xff…

数字化技术转型

这篇老生常谈(我写过N次),是应一位IM群中的朋友的困惑问答汇集而成的。(1)学科分类我上学学的是计算机系。我上的大学一开始并没有计算机系,后来是电子工程系和数学系的老师抽调组成了计算机系。后来&#…

申请大学用的是IB预估分?

IB课程体系以其独特的优越性成为越来越多国际高中生的选择。如今全球共有3300多所高校接受IB成绩申请,其中包括美国常春藤盟校、英国G5在内的多所名校。 但是,大家知道吗,国内学习IB课程的学生是需要用预估分来申请大学的。今天,小…

多用户及时通信系统

目录1. QQ用户登录1.1 用户登录11.2 用户登录21.3 用户登录32. 拉取在线用户3. 无异常退出4. 私聊系统5. 群聊3. 发送文件3.1 服务端推送新闻3.2 离线留言和离线发文件1. QQ用户登录 1.1 用户登录1 qqcommon包下 User类序列化 Message消息类序列化 MessType接口 qqclient.ut…

拉伯杠杆平台|沪指上涨,大金融板块领涨,有股票连续5涨停!

A股周二上午全体小幅上涨,大金融集体上涨,推动指数上行,商场全体动摇不大。A50期货高开高走,盘中暴拉超2.6%。 不过,部分个股仍然动摇不小,有多只股票接连涨停。 别的,新股持续分解&#xff0c…

ATAC-seq分析:数据介绍(2)

1. 简介 ATACseq (Assay for Transposase-Accessible Chromatin using sequencing) 使用转座酶在测序前有效地片段化可访问的 DNA(DNA可极性)。结果提供了一种绘制可访问/开放染色质基因组范围的方法。 与其他技术相比,ATACseq 有几个优点&am…