openGuass之CTE Reuse

2024-09-01 18:04
文章标签 cte reuse openguass

本文主要是介绍openGuass之CTE Reuse,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一. 前言

​     CTE 是指with的公共表达式,如下所示是个CTE样例:

​       CTE表达式往往在同一条sql中多次被重复引用,如上图所示的cte被引用了两次(c1 和 c2),我们称为2个CTE实例。

​       本文只要讲述在openGuass中,在sql中同一个CTE被多次引用时,数据是如何进行缓存和Reuse的。如上所示cte的c1和c2两个实例进行数据读取时,只要真正读取一次t11的表即可。

二. CTE REUSE相关数据结构

         1. 相同的CTE用的是同一个Tuplestorestate,Tuplestorestate->memtuples中缓存着改CTE的数据,Tuplestorestate->memtupcount记录着缓存里边元组的个数。
         2. 同一条sql中多次重复使用某CTE时,Tuplestorestate->readptrs记录着该CTE下每个CTE实例已经读取过的数据信息,readptrcount则记录着该CTE有多少个实例。
         3. 每个CTE实例保存有一个readptrs指针记录着访问缓存的信息,其中readptrs->current字段记录着该CTE实例已经读到的缓存数据位置,readptrs->eof_reached记录着该实例是否已经读取到缓存数据的边界。

        4. Tuplestorestate->activeptr是临时保存的CteScanState->readptr信息,每次需要操作CTE实例的时候,会把Tuplestorestate->activeptr置为CteScanState->readptr,所以记录的也即使当前操作的CTE实例。

三. CTE Reuse 实现流程和代码走读

      CTE Reuse的实现整理流程如下所示:

代码走读如下所示:

CteScanNexttuplestore_select_read_pointer(tuplestorestate, node->readptr); // node->readptr记录着是当前需要读取数据的CTE实例的ID,将此ID暂存在state->activeptr中eof_tuplestore = tuplestore_ateof(tuplestorestate);state->readptrs[state->activeptr].eof_reached;if (!eof_tuplestore) {    // 如果对应的CTE实例还有缓存信息可以读取tuplestore_gettupleslottuplestore_gettupleTSReadPointer* readptr = &state->readptrs[state->activeptr];  // 根据state->activeptr扎到对应CTE实例的readptr信息return state->memtuples[readptr->current++];  // 根据对用实例的readptr的current从缓存读取数据,并且readptr->current++,下次读取可以直接读取缓存中的下一条数据}if (eof_tuplestore) {  // 无更多的缓存数据ExecProcNode(node->cteplanstate);  // 直接通过SeqScan读取元组数据tuplestore_puttupleslot(tuplestorestate, cteslot);tuplestore_puttuple_common(state, (void*)tuple);readptr = state->readptrs;for (i = 0; i < state->readptrcount; readptr++, i++) {if (readptr->eof_reached && i != state->activeptr) {readptr->eof_reached = false;  // 将除了当前CTE实例外的其他已经eof的实例的eof_reached设置为false,因为有新的数据进缓存了readptr->current = state->memtupcount;}}state->memtuples[state->memtupcount++] = tuple;  // 将当前seqscan读到的数据保存到缓存中,并且将缓存的数量state->memtupcount++}

这篇关于openGuass之CTE Reuse的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127662

相关文章

MySQL8.0新特性CTE(Common Table Expression)

CTE(Common Table Expression)可以认为是派生表(derived table)的替代,在一定程度上,CTE简化了复杂的join查询和子查询,提高了SQL的可读性和执行性能。CTE是ANSI SQL 99标准的一部分,在MySQL 8.0.1版本被引入。 原文地址: mytecdb.com/blogDetail.php?id=75 1. CTE优势 查询语句的可读

openGuass——表空间、数据库、Schema详解

目录 一、表空间 二、数据库 三、模式:Schema 四、database schema table之间的关系 五、表 六、分区表 七、索引 八、视图 九、序列 十、同义词 十一、约束 一、表空间 自带了两个表空间:pg_default和pg_global。查看命令:\db 默认表空间pg_default:用来存储非共享系统表、用户表、用户表index、临时表

OpenGuass under Ubuntu_22.04 install tutorial

今天开始短学期课程:数据库课程设计。今天9点左右在SL1108开课,听陈老师讲授了本次短学期课程的要求以及任务安排,随后讲解了国产数据库的三层架构的逻辑。配置了大半天才弄好,放一张成功的图片,下面开始记录成功的步骤: My operator system is Ubuntu_22.04. procedures sudo wget https://opengauss.obs.cn-so

openGuass——管理用户安全

一、默认权限机制 二、管理员  1、核心管理员  2、辅助管理员 三、三权分立 1、思想 2、实践 四、权限操作 1、用户的创建与删除 2、用户的修改与信息查看 五、角色 1、创建、修改和删除角色 六、GRANT 七、REVOKE 八、设置用户安全策略 自动锁定和解锁用户 手动锁定和解锁用户 设置帐号有效期 设置密码安全策略 一、默认权限机制 对象创

书籍推荐|经典书籍ic书籍REUSE METHODOLOGY MANUALFOR等和verilog网站推荐(附下载)

大家好,今天是51过后的第一个工作日,想必大家都还没有完全从节假日的吃喝玩乐模式转变为勤勤恳恳的打工人模式,当然也包括我,因此这次更新主要是分享几篇书籍和verilog相关的学习网站~ 首先是一本数字电路相关的基础书籍,《数字电子技术基础》是一门介绍数字电子技术基本原理、基本方法和基本技能的课程。它主要研究各种集成器件以及逻辑门电路、集成芯片功能并进行其应用。具体内容包括数字电路的基本概念、数字

boost::asio::ip::tcp::acceptor::reuse_address

boost::asio::ip::tcp::acceptor::reuse_address 是一个选项,用于设置 tcp::acceptor 对象是否可以在绑定到一个地址后立即重新使用该地址。 在网络编程中,当服务器程序关闭后,操作系统可能会保留 socket 使用的地址一段时间。在这段时间内,如果你的服务器立即重启,尝试再次绑定到同一个地址,会导致 "地址已在使用" 的错误。设置 reuse_

设计模式:合成复用原则(Composite Reuse Principle,CRP)介绍

合成复用原则(Composite Reuse Principle,CRP)是面向对象设计原则之一,它强调通过组合已有的对象来实现新的功能,而不是通过继承已有的类来实现。合成复用原则的核心思想是尽量使用对象组合而不是类继承,从而使系统更加灵活、可复用和可维护。 该原则的实现原理可以通过以下几点来说明: 通过组合实现代码复用: 将已有的类组合在一起,形成一个新的类,新的类可以通过调用组合类的

如何在PostgreSQL中使用CTE(公共表表达式)来简化复杂的查询逻辑?

文章目录 解决方案步骤示例代码 结论 在处理复杂的SQL查询时,我们经常会遇到需要多次引用子查询或中间结果的情况。这可能会使得查询变得冗长且难以理解。为了解决这个问题,PostgreSQL(以及其他一些SQL数据库系统)引入了公共表表达式(Common Table Expressions,简称CTE)的概念。CTE允许我们定义一个临时的结果集,这个结果集可以在后续的查询中被多

Python: Create - Modify - Reuse

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版、作者信息和本声明。否则将追究法律责任。 http://blog.csdn.net/topmvp - topmvp Aimed at all levels of Python developers who are interested in a task-based way of learning Python deve

mysql公用表表达式CTE

公用表达式是MySQL8.0的新特性,它是一个命名的临时结果集,作用范围是当前语句。 可以理解成为当前sql语句定义了一个视图,sql语句的任何地方都可以使用这个视图,如果被多次使用就体现出了公用表达式的特点公用。 依据语法结构和执行方式不同,公用表达式可以分为普通公用表达式和递归公用表达式。 #公共表表达式定义语法 WITH [RECURSIVE]cte_name [(col_na