openGuass之CTE Reuse

news2024/9/20 0:29:44
一. 前言

​     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的实现整理流程如下所示:

代码走读如下所示:

CteScanNext
    tuplestore_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_gettupleslot
            tuplestore_gettuple
                TSReadPointer* 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++
   }

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

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

相关文章

Windows系统Nginx下载安装配置 运行错误处理

Nginx是一款轻量级的web 服务器/反向代理 服务器。本篇文章主要是nginx的下载安装&#xff0c;处理运行中遇到的问题&#xff0c;配置反向代理。主要分为两部分&#xff1a;下载安装和配置。 目录 1.下载安装 2.nginx配置反向代理 1.下载安装 nginx官网&#xff1a;nginx: …

新160个crackme -044-tsrh-crackme

运行分析 提示去除NAG 不去除NAG也能进入主窗口&#xff0c;需要破解Name和Serial PE分析 ASM程序&#xff0c;32位&#xff0c;壳未知 去除NAG ida搜索字符串&#xff0c;发现NAG弹窗标题字符串&#xff0c;双击进入函数 找到了messagebox&#xff0c;即NAG位置00401079 打开x…

网络压缩之动态计算(dynamic computation)

动态计算希望网络可以自由 地调整它需要的计算量。为什么期待网络可以自由地调整它需要的计算量呢? 因为有时候我 们可能同样的模型会想要跑在不同的设备上面&#xff0c;而不同的设备上面的计算资源是不太一样的。所以期待训练好一个网络以后&#xff0c;放到新的设备上面&am…

Python编程基础知识,让编程基础更加扎实(输出个人简介)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

考研--数学(相关公式)

解析几何 知识点1 A(x1,y1) B(x2,y2) 则AB长度 |AB| A、B中点的坐标 &#xff08;&#xff0c;) 知识点2 方程求解 ①点斜式&#xff1a; y-y0k(x0-x) ②斜率式&#xff1a; ykxb ③两点式&#xff1a; …

【笔记篇】Davinci Configurator CanNm模块

目录 1 简介1.1 架构概览2 功能描述2.1 特性2.2 初始化2.3 状态机2.3.1 网络模式2.3.1.1 重复报文状态2.3.1.2 正常状态2.3.1.3 准备休眠状态2.3.2 预休眠模式2.3.3 总线休眠模式2.4 被动模式(对于被动节点)2.5 NM报文格式2.6 NM报文发送2.6.1 重试第一次报文请求2.7 降低总线…

集成电路学习:什么是I2C内部集成电路总线

I2C&#xff1a;内部集成电路总线 I2C&#xff0c;全称Inter-Integrated Circuit&#xff0c;即内部集成电路总线&#xff0c;是由飞利浦公司&#xff08;现为恩智浦半导体&#xff09;在上世纪八十年代初开发的一种同步的串行通信总线。它以其接线简单、硬件实现容易、可扩展性…

Mysql8利用binlog实现数据恢复

文章目录 1binlog基本概念2 binlog相关常用命令3 binlog工具mysqlbinlog4 测试数据准备&导入数据5 模拟误删表6 数据恢复方式说明7 数据恢复分析(偏移量方式恢复)8 数据恢复9 验证10 数据恢复的局限性11 总结 1binlog基本概念 binlog即binary log&#xff0c;二进制日志文件…

【React原理 - 任务调度之中断恢复】

概览 本文紧接上文介绍React调度的时间分片中任务中断和恢复&#xff0c;由于篇幅过长&#xff0c;所以拆成了两篇。上文主要介绍了调度器中的优先级和调度任务的触发、注册和调度循环。本文主要从任务调度入手介绍调度任务之后发送了什么&#xff0c;即在协调器中如何进行到f…

【matlab】数组操作:寻找最大值和最小值及其位置ind2sub函数

【matlab】数组操作&#xff1a;寻找最大值和最小值及其位置ind2sub函数 本文将介绍如何在MATLAB环境中使用内置函数来创建数组&#xff0c;以及如何找到数组中的最大值和最小值及其对应的位置。通过示例代码&#xff0c;我们将一步步展示这一过程&#xff0c;帮助读者更好地理…

探索Python的测试之道:unittest库的奥秘

文章目录 探索Python的测试之道&#xff1a;unittest库的奥秘背景&#xff1a;为何选择unittest&#xff1f;什么是unittest库&#xff1f;如何安装unittest库&#xff1f;简单库函数使用方法场景应用场景一&#xff1a;测试数学运算场景二&#xff1a;测试异常处理场景三&…

armv8 memory model概述

概述 在armv8 架构中&#xff0c;它引入了更多的维度来描述内存模型&#xff0c;从而在此基础上进行硬件优化(但其中一些并未被主流的软件所接受)&#xff0c;在此做一些简单的整理&#xff0c;更多信息请参考 Arm spec 以及 AMBA 协议。下文主要是对Memory 和 Device 两大类的…

Python 算法交易实验86 QTV200日常推进-获取A股日交易额并统计

说明 上一篇说到&#xff0c;交易量可能可以作为策略规则的支持度分析&#xff0c;但是(我现在还不想付费买数据)现成的接口似乎并没有这样的统计。获取某一只股票的日交易数据是相对简单的&#xff0c;市场上也就不到5000只的股票&#xff0c;总数据量应该也不会超过18M(5000…

面向整个价值链的高可信度卫星测试解决方案

在动态行业格局中增强卫星任务能力 在罗德与施瓦茨&#xff0c;我们利用专业知识和量身定制的测试和测量解决方案为卫星行业提供支持。这包括帮助行业参与者满足完整测试路径的要求&#xff0c;以实现完美的系统性能&#xff0c;确保符合最新技术和标准。此外&#xff0c;我们…

2024年8月文章一览

2024年8月编程人总共更新了3篇文章&#xff1a; 1.2024年7月文章一览 2.《Programming from the Ground Up》阅读笔记&#xff1a;p95-p102 3.《Programming from the Ground Up》阅读笔记&#xff1a;p103-p116 8月&#xff0c;对自己而言是糟糕的一个月&#xff0c;两个项…

4-8 进入C语言,并跳转到loarder(1)

1 总体的逻辑。 从这里开始 写 loader 代码了。 1 首先是 从汇编跳转到 C原因呢&#xff0c; 2 然后是 &#xff0c; 再源码中新建新的loader 目录。 3 一直跳转到 loader 目录的C语言函数里面&#xff0c; 做循环操作。 2 代码&#xff1a; 首先 是从 start.s 跳转到 boot…

论文阅读:MicroNet: Towards Image Recognition with Extremely Low FLOPs

论文地址&#xff1a;https://arxiv.org/pdf/2011.12289 发表时间&#xff1a;2022 项目地址&#xff1a;https://github.com/liyunsheng13/micronet MicroNet是一种有效的卷积神经网络&#xff0c;使用极低的计算成本&#xff08;例如&#xff0c;在ImageNet分类上的6M FLOPs…

基于STM32的无线语音放大系统设计

本设计基于STM32设计了一种无线语音放大系统。该系统由语音采集模块、STM32核心控制模块、NRF24L01无线通信模块和语音放大模块组成。语音采集模块承担着对采集到的语音信号进行预处理的任务。STM32单片机负责控制整个系统的运行过程&#xff0c;包括数据处理、发送端的模数转换…

华为云征文|华为云Flexus X实例ultralytics模型yolov10深度学习AI部署与应用

目录 前言&#xff1a; 环境准备 购买服务器配置 连接服务器 安装Python 安装Pytorch 部署YOLOv10 拉取YOLOv10代码并安装相关依赖 数据集准备 Detect目标检测模型训练 训练数据集的配置文件 训练命令 识别命令 前言&#xff1a; 本实验演示从0到1部署YOLOv10深度…