[超硬核] 5000字带走读DuckDB优化器之常量折叠与比较简化

news2025/1/17 3:48:02

DuckDB优化器之常量折叠与比较简化

本篇文章适合学习C++的小伙伴,适合阅读开源项目的小伙伴,更适合学习数据库的小伙伴,欢迎与我一起探索优化器知识。

目录

  • DuckDB优化器之常量折叠与比较简化

  • 1.优化器规则

  • 2.表达式重写

    • 2.1 重写/访问算子

    • 2.2 应用规则

    • 2.3 子表达式

  • 3.比较简化规则

本节以一个SQL为例,揭秘DuckDB的优化器常量折叠与比较简化规则。

  • ConstantFoldingRule

    • 常量折叠

  • ComparisonSimplificationRule

    • 比较简化

示例如下

常量折叠:

D explain select temp_lo from weather where temp_lo = 45 + 1;

┌─────────────────────────────┐
│┌───────────────────────────┐│
││       Physical Plan       ││
│└───────────────────────────┘│
└─────────────────────────────┘
┌───────────────────────────┐
│         SEQ_SCAN          │
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
│          weather          │
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
│          temp_lo          │
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
│  Filters: temp_lo=46 AND  │
│     temp_lo IS NOT NULL   │
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
│           EC: 0           │
└───────────────────────────┘  
  
// 重写前
temp_lo = (45 + 1)
  
// 重写后
(lldb) p expr->ToString() 
temp_lo = 46

比较简化:

D explain select * from test where CAST(i as TIMESTAMP) = '1999-01-01'::TIMESTAMP;

┌─────────────────────────────┐
│┌───────────────────────────┐│
││       Physical Plan       ││
│└───────────────────────────┘│
└─────────────────────────────┘
┌───────────────────────────┐
│         SEQ_SCAN          │
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
│            test           │
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
│             i             │
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
│Filters: i=1999-01-01 00:00│
│   :00 AND i IS NOT NULL   │
│   ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
│           EC: 0           │
└───────────────────────────┘ 
  
// 重写前
CAST(i as TIMESTAMP) = '1999-01-01'::TIMESTAMP

// 重写后
i = '1999-01-01 00:00:00'

这两条SQL语句的逻辑算子为:

LOGICAL_EXPLAIN->LOGICAL_PROJECT->LOGICAL_FILTER->LOGICAL_GET

顶层是explain,然后->表示其child,依次类推。

内容已更新至知识星球,感兴趣加入即可。

5e3b59815cfbd2865440255a4e9c8a46.jpeg

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

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

相关文章

makefile之目标文件生成

目标文件:源码经过编译还没有链接那些中间文件.linux .o文件 gcc $(CFLAGS) -c xxx.c -o xx.o include Makefile.config SRC : $(wildcard *.c wildcard ./audio_module/*.c) SRC_OBJ $(patsubst %.c,%.o,$(SRC))all:$(SRC_OBJ) $(info contents $(SRC))$(info objfiles $(SR…

Tomcat部署与调优

一、Tomcat概述: Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,具有处理HTML页面的功能,然而由于其处理静态HTML的能力远不及Apac…

81 # 多语言

多语言实现方案 1、一个完整多个路径来实现多语言 2、前端来实现多语言(先配置好两种语言,动态切换内容),比如 i18n,vue-i18n 3、服务端的 header 来实现切换多语言 accept-language: zh-CN,zh;q0.9 const fs req…

台式万用表几位的概念以及NPLC的功能作用

数字万用表测量电流和电压的基本原理是通过检测传感器的电阻,电容,或电感等特性,将电流或电压转化为可以测量的电信号,然后这个电信号被转化为数字信号进行处理和显示。具体的,当测量电压时,万用表的输入端…

【SpringMVC】Jrebel 插件实现热部署与文件上传

目录 一、JRebel 1.1 Jrebel介绍 1.2 Jrebel插件下载 1.3 Jrebel服务下载并启动 1.4 在线生成GUID 1.5 JRebel激活 1.6 相关设置 注意❗ 二、文件上传、下载 2.1 导入pom依赖 2.2 配置文件上传解析器 2.3 文件上传表单设置 2.4 文件上传实现 2.5 文件下载实现 2…

[源码系列:手写spring] IOC第十四节:容器事件和事件监听器

代码分支 https://github.com/yihuiaa/little-spring/tree/event-and-event-listenerhttps://github.com/yihuiaa/little-spring/tree/event-and-event-listener 内容介绍 事件监听器机制 Spring的容器事件和事件监听器机制允许应用程序在容器中发生特定事件时执行自定义逻辑…

Hadoop的HDFS的集群安装部署

注意:主机名不要有/_等特殊的字符,不然后面会出问题。有问题可以看看第5点(问题)。 1、下载 1.1、去官网,点下载 下载地址:https://hadoop.apache.org/ 1.2、选择下载的版本 1.2.1、最新版 1.2.2、其…

SQL数据库查询超时,查询数据库的哪些表被上锁的语句

1.异常提示 2.表语句 2.1 查询锁表的语句 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_typeOBJECT * 若是下面没有显示内容,说明当前没有锁住的表 2.2若是有显示锁住的表&#…

【实践篇】Redis最强Java客户端(一)之Redisson入门介绍

Redisson入门介绍 文章目录 Redisson入门介绍1.1 Redisson简介1.1.1 起源和历史1.1.2 优势和特点1.1.3 与其他Java Redis客户端的比较 1.2 使用和配置1.2.1 依赖和SDK1.2.2 配置文件解析1.2.3 连接池配置 1.3 优雅的让Hash的某个Field过期2. 参考资料3. 源码地址4. Redis从入门…

9. xaml ComboBox控件

1.运行图像 2.运行源码 a.Xaml源码 <Grid Name="Grid1"><!--IsDropDownOpen="True" 默认就是打开的--><ComboBox x:Name="co

flink的网络缓冲区

背景 在flink的taskmanager进行数据交互的过程中&#xff0c;网络缓冲区是一个可以提升网络交换速度的设计&#xff0c;此外&#xff0c;flink还通过网络缓冲区实现其基于信用值credit的流量控制&#xff0c;以便尽可能的处理数据倾斜问题 网络缓冲区 在flink中每个taskmana…

Jetsonnano B01 笔记6:开启USB摄像头

今日继续我的Jetsonnano学习之路&#xff0c;今日尝试开启一下USB摄像头&#xff0c;显示拍摄的内容。 测试代码是搬运的官方说明&#xff0c;这里只是作笔记记录学习&#xff1a; 目录 额外模块准备&#xff1a; 测试代码分析&#xff1a; 运行效果&#xff1a; 额外模块准…

【Windows】磁盘管理无法删除卷

磁盘管理无法删除卷 由于HP Cloud Recovery Tool在对U盘分区时出现闪退 尝试在Windows磁盘管理中使U盘恢复“未分配状态” 右键删除卷出现报错 虚拟磁盘管理器&#xff1a;不支持该请求 ✨解决方案 使用diskpart命令行工具 在Terminal运行如下命令行 diskpart # 列出所有…

C++ day 3

1、 自行封装一个栈的类&#xff0c;包含私有成员属性&#xff1a;栈的数组、记录栈顶的变量&#xff0c;成员函数完成&#xff1a;构造函数、析构函数、拷贝构造函数、入栈、出栈、清空栈、判空、判满、获取栈顶元素、求栈的大小 stack.h #ifndef STACK_H #define STACK_H#…

业务安全详解

文章目录 一、 业务安全概述1.1 业务安全现状1.1.1 业务逻辑漏洞1.1.2 黑客攻击的目标 二、 业务安全测试2.1 业务安全测试流程2.1.1 测试准备2.1.2 业务调研2.1.3 业务建模2.1.4 业务流程梳理2.1.5 业务风险点识别2.1.6 开展测试2.1.7 撰写报告 三、 业务安全经典场景3.1 业务…

【Java 基础篇】Java Set 集合详解:轻松管理不重复元素

在 Java 编程中&#xff0c;集合是一个非常重要的概念&#xff0c;它允许我们有效地存储和管理一组对象。其中之一是 Set 集合&#xff0c;它是一种无序、不重复的数据结构&#xff0c;非常适合用于存储不重复的元素。本篇博客将深入探讨 Java 中的 Set 集合&#xff0c;从基本…

数电课程设计——课设二:交通信号灯

一、实验内容 &#xff08;1&#xff09;十字路口有 x、y 方向两组交通信号灯&#xff0c;每组有红、黄、绿灯各一个&#xff1b; &#xff08;2&#xff09;设计一个交通灯控制电路&#xff0c;模拟十字路口交通灯工作情况&#xff0c;红灯亮 35s&#xff0c;黄灯亮 5s&…

IP的基础知识

IP IP指网际互连协议&#xff0c;Internet Protocol的缩写&#xff0c;是TCP/IP体系中的网络层协议。 设计IP的目的是提高网络的可扩展性&#xff1a;一是解决互联网问题&#xff0c;实现网络的互联互通&#xff1b;二是解除顶层网络应用和底层网络技术之间的耦合。 根据端到端…

btree学习笔记

简介 btree&#xff1a;balance tree&#xff0c;平衡多叉树&#xff0c;类比avl&#xff1a;平衡二叉树&#xff0c;都是有平衡的属性 (多个子树高度一致)&#xff0c;只不过是二叉和多叉的区别。 使用场景 文件系统如extfs、jffs&#xff0c;sql&#xff0c;磁盘上的索引查…

VirtualBox(内有Centos 7 示例安装)

1常见概念以及软件安装 1.1 虚拟化技术&#xff1a; 虚拟化技术指的是将计算机的各种硬件资源加以抽象、转换、分割&#xff0c;最后组合 起来的技术。其目的和作用主要是打破硬件资源不可分的情况&#xff0c;方便程序员自 己集成所需资源。 1.2 Virtual Box 其是虚拟化技术作…