当前位置: 首页 > news >正文

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++}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据仓库系列17:元数据管理在数据仓库中的作用是什么?
  • 实用好软-----电脑端 开源的视频无损剪切与合并工具
  • Linux——性能调优工具一览
  • 数据资产目录中的主数据划分(汽车制造行业)
  • Go语言设计与实现 学习笔记 第六章 并发编程(2)
  • Ubuntu/Linux 配置 locale
  • 【AI学习笔记】AIGC,AI绘画 ComfyUI+ComfyUI Manager安装
  • [服务器_1]rpc框架收集
  • 入行「游戏策划」,该从何处下手?
  • django外键表查询
  • 黑马程序员Python数据挖掘|1Jupyter Notebook的使用
  • JAVA学习-练习试用Java实现“数据流的中位数”
  • 金融科技初创企业建设指南
  • 解决方案:在autodl环境下安装torch被killed掉
  • 随笔十、音频扩展模块测试
  • android图片蒙层
  • C++类中的特殊成员函数
  • CAP 一致性协议及应用解析
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JavaScript设计模式与开发实践系列之策略模式
  • javascript数组去重/查找/插入/删除
  • js继承的实现方法
  • nginx 负载服务器优化
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Python语法速览与机器学习开发环境搭建
  • SpiderData 2019年2月23日 DApp数据排行榜
  • 翻译:Hystrix - How To Use
  • 强力优化Rancher k8s中国区的使用体验
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 小试R空间处理新库sf
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 阿里云ACE认证之理解CDN技术
  • 阿里云服务器如何修改远程端口?
  • # SpringBoot 如何让指定的Bean先加载
  • ###C语言程序设计-----C语言学习(6)#
  • #php的pecl工具#
  • #pragma 指令
  • #stm32驱动外设模块总结w5500模块
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (7)svelte 教程: Props(属性)
  • (自用)gtest单元测试
  • *p++,*(p++),*++p,(*p)++区别?
  • .bat批处理(六):替换字符串中匹配的子串
  • .mysql secret在哪_MySQL如何使用索引
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET Framework 3.5安装教程
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .sh
  • []sim300 GPRS数据收发程序
  • [20170705]diff比较执行结果的内容.txt
  • [3D基础]理解计算机3D图形学中的坐标系变换
  • [Apio2012]dispatching 左偏树