PostgreSQL源码学习–执行器#9「建议收藏」

PostgreSQL源码学习–执行器#9「建议收藏」本节介绍ExecutePlan函数 相关数据结构 typedef enum ScanDirection { BackwardScanDirection = -1, NoMovementScanDir…

PostgreSQL源码学习--执行器#9

本节介绍ExecutePlan函数

相关数据结构

typedef enum ScanDirection
{
	BackwardScanDirection = -1,
	NoMovementScanDirection = 0,
	ForwardScanDirection = 1
} ScanDirection;

代码100分

ExecutePlan函数

代码100分static void
ExecutePlan(EState *estate,
			PlanState *planstate,
			bool use_parallel_mode,
			CmdType operation,
			bool sendTuples,
			uint64 numberTuples,
			ScanDirection direction,
			DestReceiver *dest,
			bool execute_once);

执行查询计划,直到获取到numberTuples个元组,并且处理时朝direction方向移动。

//src/backend/executor/execMain.c

/* 初始化本地变量 */
current_tuple_count = 0;

/* 设置扫描移动方向 */
estate->es_direction = direction;

/* 如果计划可能被多次执行,那么它不可以并行执行,因为处理可能提前退出 */
if (!execute_once)
	use_parallel_mode = false;

estate->es_use_parallel_mode = use_parallel_mode;
if (use_parallel_mode)
	EnterParallelMode();

/* 循环,直到我们从计划中处理了适当数量的元组。*/
for (;;)
{
	/* 重置每个输出元组的expr上下文 */
	ResetPerTupleExprContext(estate);
	
	/* 执行计划并获取一个元组 */
	slot = ExecProcNode(planstate);
	
	/* 如果没有元组了,那么假定就是执行完成了,所以跳出循环 */
	if (TupIsNull(slot))
	{
		/* 如果不需要倒退那直接在这里释放资源就行 */
		if (!(estate->es_top_eflags & EXEC_FLAG_BACKWARD))
			(void) ExecShutdownNode(planstate);
		break;
	}
	
	/* 有需要的话,对元组进行“垃圾属性”过滤“ */
	if (estate->es_junkFilter != NULL)
		slot = ExecFilterJunk(estate->es_junkFilter, slot);
	
	/* 有需要的话,发送元组到某处 */
	if (sendTuples)
	{
		/* 若发送失败,那么假定是目标被关闭了,所以结束循环 */
		if (!dest->receiveSlot(slot, dest))
			break;
	}
	
	/* 如果是SELECT操作,统计处理的元组数量 */
	if (operation == CMD_SELECT)
		(estate->es_processed)++;
	
	/* 检查处理的元组数量,如果已经够了,那么退出。
	 * 如果numberTuples是0的话,表示没有限制 */
	current_tuple_count++;
	if (numberTuples && numberTuples == current_tuple_count)
	{
		/* 如果不需要倒退那直接在这里释放资源就行 */
		if (!(estate->es_top_eflags & EXEC_FLAG_BACKWARD))
			(void) ExecShutdownNode(planstate);
		break;
	}
}

if (use_parallel_mode)
	ExitParallelMode();

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/7886.html

(0)
上一篇 2023-03-12
下一篇 2023-03-12

相关推荐

  • 技术分享 | 如何优雅地在 Windows 上从 MySQL 5.6 升级到 5.7「终于解决」

    技术分享 | 如何优雅地在 Windows 上从 MySQL 5.6 升级到 5.7「终于解决」作者:赵黎明 爱可生 MySQL DBA 团队成员,Oracle 10g OCM,MySQL 5.7 OCP,擅长数据库性能问题诊断、事务与锁问题的分析等,负责处理客户 MySQL 及我司自研 DM…

    2023-03-21
    93
  • MySQL进阶篇(03):合理的使用索引结构和查询

    MySQL进阶篇(03):合理的使用索引结构和查询本文源码:GitHub·点这里 || GitEE·点这里 一、高性能索引 1、查询性能问题 在MySQL使用的过程中,所谓的性能问题,在大部分的场景下都是指查询的性能,导致查询缓慢的根本原因是数据量…

    2023-03-31
    101
  • Python __call__方法的用法和实例详解

    Python __call__方法的用法和实例详解Python是一门强大的面向对象编程语言,支持各种特殊方法,其中就包括__call__方法。本文将详细介绍__call__方法的用法和实例。

    2024-04-15
    24
  • mongodb设计规范_mongodb菜鸟教程

    mongodb设计规范_mongodb菜鸟教程最近刚入坑MongoDB,感觉比MySQL扩展性更强,一张表可以存储特别复杂的字段,这点我非常喜欢,最近需要用MongoDB存储一篇文章的数据,文章的评论和回复的数据存储是个大问题,设计了好久感觉我设

    2023-04-15
    116
  • 触发器insert

    触发器insertUSE [stalentzx]GO/****** Object: Trigger [dbo].[GZ_HISTORY_INSERT] Script Date: 2019/12/24 13:11:40

    2022-12-28
    99
  • [转] Oracle sql语句执行顺序「终于解决」

    [转] Oracle sql语句执行顺序「终于解决」sql语法的分析是从右到左 一、sql语句的执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限…

    2023-03-31
    111
  • 如何安装jieba库

    如何安装jieba库jieba是一款中文分词库,由于其简洁易用的特点,成为了众多自然语言处理(NLP)工程师的选择。然而,很多初学者在安装jieba时,可能会遇到一些问题,比如说安装不了或者安装了但是用不了。本文将从多个方面对jieba库的安装进行详细地阐述,并提供解决方案。

    2024-04-18
    19
  • 荣耀路由3开箱_荣耀路由3覆盖范围

    荣耀路由3开箱_荣耀路由3覆盖范围     520快到了,送什么礼物给男朋友呢?正好,昨天刷微博的时候看到了荣耀智慧生活新品发布会正在直播,看过之后我决定了,就送这款荣耀路由3!以前和男朋友视频通话的时候总是卡顿,一起吃鸡的时候他也…

    2023-03-03
    103

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注