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

Go语言从零构建SQL数据库(8):执行计划的奥秘

从SQL语句到高效查询:执行计划的奥秘

想象你是一位旅行者,想从北京到上海。你告诉导航软件你的目的地(类似SQL查询),但导航软件需要为你规划具体路线——是走高速公路还是国道?是选择最短距离还是最省时间的路线?这个"路线规划",就像数据库中的执行计划。

SQL查询的挑战

当用户输入一个SQL查询时,他们只是表达了"我想要什么数据",而没有指定"如何获取这些数据"。例如:

SELECT name, age FROM users WHERE salary > 5000

这告诉数据库:我需要薪资超过5000的用户的姓名和年龄。但数据库如何高效地找到这些数据呢?

查询方案1
扫描全表
过滤薪资>5000
返回name,age
查询方案2
使用薪资索引
获取匹配记录
返回name,age
  • 是先读取所有用户记录,再筛选出薪资高的?
  • 还是先通过索引找到高薪用户,再获取他们的姓名和年龄?
  • 如果有几百万用户,两种方法的性能可能相差上千倍!

数据库的"导航系统"

执行计划正是解决这一难题的关键——它将"我要什么数据"转换为"如何高效获取这些数据"的具体步骤。

好的执行计划能带来惊人的性能提升:同样的查询,可能从几分钟缩短到几毫秒。这就是为什么执行计划在数据库引擎中如此重要。

SQL语句
语法分析
语法树AST
逻辑计划生成
逻辑计划
优化器
优化后的逻辑计划
物理计划生成器
物理执行计划
执行引擎
查询结果

两层设计的智慧

执行计划通常分为两个层次:

  1. 逻辑计划:描述查询的逻辑步骤,好比"从北京到上海"
  2. 物理计划:确定具体执行算法,相当于"走G2高速,经过济南,预计用时5小时"
逻辑计划
物理计划A: 顺序扫描
物理计划B: 索引扫描
物理计划C: 哈希连接

这种分层设计非常聪明,原因有三:

  • 关注点分离:先确定要做什么,再决定怎么做
  • 优化灵活性:同一逻辑操作可以有多种物理实现方式
  • 技术升级简化:可以改进物理实现(比如新算法)而不影响上层逻辑

就像你的旅行,先确定要去上海(逻辑目标),再决定是坐飞机、高铁还是自驾(物理实现)。

构建执行计划的核心组件

计划节点:组织成树状结构

执行计划通常构建为树状结构,这种设计很自然地反映了数据处理的流程:

投影: SELECT name, age
过滤: WHERE salary > 5000
表扫描: users表
  • 叶子节点:获取数据的来源(如表扫描)
  • 中间节点:处理数据的操作(如过滤、排序)
  • 数据自下而上流动:从数据源到最终结果

这种树状结构非常清晰,每个节点只关心接收数据、处理数据和输出数据,不需要了解整个查询的复杂性。

接口设计:灵活性的基石

我们为执行计划设计了接口而非具体类型,这带来了巨大的灵活性:

type LogicalPlan interface {PlanType() PlanTypeChildren() []LogicalPlanSchema() *SchemaString() string
}
«interface»
LogicalPlan
+PlanType() : PlanType
+Children() : []LogicalPlan
+Schema() : Schema
+String() : string
LogicalTableScan
+TableName string
+Schema *Schema
LogicalFilter
+Input LogicalPlan
+Condition Expression
LogicalProjection
+Input LogicalPlan
+Expressions []Expression
+OutputSchema *Schema

这种接口设计有几个关键好处:

  1. 扩展性:可以轻松添加新的计划节点类型
  2. 低耦合:不同模块通过接口交互,而非具体实现
  3. 测试便利:可以创建模拟实现进行单元测试

想象一下,如果没有这种接口设计,每添加一种新的操作类型(如窗口函数),就需要修改整个系统的代码。

Schema系统:类型的守护者

执行计划需要知道每个操作产生的数据结构,这就是Schema的作用:

type Schema struct {Columns []*Column
}type Column struct {Name     stringTable    stringDataType DataType
}
1
*
Schema
+Columns []*Column
Column
+Name string
+Table string
+DataType DataType

Schema系统看似简单,但功能强大:

  1. 类型检查:确保操作应用于兼容类型(不能对字符串求平均值)
  2. 列引用解析:当有多表连接时,确定列来自哪个表
  3. 结果描述:告诉客户端返回数据的结构

没有Schema,数据库就像是没有类型检查的语言,可能在运行时才发现致命错误。

表达式系统:计算的引擎

表达式是查询的核心,表示过滤条件、计算列等。设计独立的表达式系统有多重好处:

graph TDA[表达式系统] --> B[列引用: user.age]A --> C[字面量: 5000]A --> D[函数调用: YEAR(birth_date)]A --> E[二元操作: price * quantity]style A fill:#f9f,stroke:#333
  1. 统一表示:无论是简单比较还是复杂函数,都用同一套系统表示
  2. 类型安全:在执行前检查表达式类型是否正确
  3. 优化机会:可以对表达式进行变换和优化

例如,系统可以自动将 price * 0 优化为常量 0,避免不必要的计算。

完整的计划转换流程

当我们把所有组件结合起来,就能实现从SQL到执行计划的完整转换:

SQL文本
词法分析器
语法分析器
语法树AST
计划生成器
逻辑计划
优化器
优化后的逻辑计划
物理计划生成器
物理执行计划
执行引擎
查询结果

这整个流程看似复杂,但每一步都有其不可替代的作用,共同确保数据库能够高效地执行查询。

总结与未来方向

通过这种设计,我们的数据库引擎能够:

  1. 将用户的声明式查询转换为高效的执行步骤
  2. 灵活应对各种查询模式和数据规模
  3. 为后续优化提供坚实基础
当前系统
增加聚合操作
实现基于成本的优化
丰富表达式函数
优化物理执行策略

未来,我们还可以增强系统的多个方面:

  • 支持更多的操作类型(如聚合、排序)
  • 实现基于成本的查询优化
  • 添加更丰富的表达式函数
  • 优化物理执行策略

理解了执行计划的设计理念,我们就能更好地构建高性能、可扩展的数据库系统。下一篇文章,我们将探讨如何实现对SELECT * 查询的支持,进一步完善我们的执行计划生成器。

相关文章:

Go语言从零构建SQL数据库(8):执行计划的奥秘

从SQL语句到高效查询:执行计划的奥秘 想象你是一位旅行者,想从北京到上海。你告诉导航软件你的目的地(类似SQL查询),但导航软件需要为你规划具体路线——是走高速公路还是国道?是选择最短距离还是最省时间…...

UNet 改进(12):UNet with ECA (Efficient Channel Attention) 网络

详解 下面将详细解析这个实现了ECA注意力机制的UNet网络代码。 1. 代码概述 代码实现了一个带有Efficient Channel Attention (ECA)模块的UNet网络架构。 UNet是一种常用于图像分割任务的编码器-解码器结构网络,而ECA模块则是一种轻量级的通道注意力机制,可以增强网络对重…...

关于 AI驱动的智慧家居、智慧城市、智慧交通、智慧医疗和智慧生活 的详细解析,涵盖其定义、核心技术、应用场景、典型案例及未来趋势

以下是关于 AI驱动的智慧家居、智慧城市、智慧交通、智慧医疗和智慧生活 的详细解析,涵盖其定义、核心技术、应用场景、典型案例及未来趋势: 一、AI智慧家居 1. 定义与核心功能 定义:通过AI与物联网(IoT)技术&#…...

Windows11-24h2的任务栏时间显示秒 笔记250417

Windows11-24h2的任务栏时间显示秒 笔记250417 打开注册表编辑器 WinR输入 regedit 回车。 修改注册表项 定位到路径: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced右键右侧空白处 → 新建【DWORD (32位)值】→ 命名为 ShowSec…...

机器学习的简单应用

什么是机器学习? 定义: ‌机器学习(Machine Learning, ML)‌ 是人工智能(AI)的一个子领域,其核心是 ‌通过算法让计算机从数据中自动学习规律,并基于这些规律对新数据做出预测或决策…...

双 Token 与 单 Token 优缺点

双Token与单Token认证机制对比 在Web应用开发中,身份认证和授权是保障系统安全的核心环节。随着技术演进,基于Token的认证机制逐渐取代传统Session方案,而双Token与单Token架构的选型争议也日益成为开发者关注的焦点。本文将从技术原理、优缺…...

第五章 SQLite数据库:6、SQLite 常用语法1

SQLite Insert 语句 SQLite 的 INSERT INTO 语句用于向数据库的某个表中添加新的数据行。 语法 INSERT INTO 语句有两种基本语法,如下所示: INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)] VALUES (value1, value2, value3,...…...

JVM考古现场(二十二):降维打击·用二向箔优化内存模型

"警报!三维堆内存正在经历二维化坍缩!" 我腰间的玄铁令突然震动,在蜀山剑派的量子剑阵中投射出诡异的曼德博分形——这是三体文明发动降维打击的铁证! 楔子:二向箔奇点降临 昆仑镜监控日志: // …...

eclipse常用快捷键

Eclipse 是一款功能强大的 Java 集成开发环境(IDE),熟练掌握其快捷键可以显著提高开发效率。下面是一些常用的 Eclipse 快捷键分类介绍: 编辑相关快捷键 操作快捷键说明内容辅助Alt /调出代码提示和自动补全功能,根…...

TAS(Thin-Agent服务)的先决条件与安装指南

TAS(Thin-Agent服务)的先决条件与安装指南 2.1 支持的操作系统 TAS支持以下操作系统环境: Windows 服务器 • Windows Server 2008 R2 SP1 • Windows Server 2012 R2 • Windows Server 2016 Linux 发行版 • Red Hat Enterprise Linux (RHE…...

无线uniapp调试设备

创作灵感来自某篇博客 uniapp安卓手机无线真机调试教程_uniapp无线真机调试-CSDN博客...

TAS启动与卸载

3. 启动TAS(Thin-Agent服务) TAS在安装完成后通常会自动启动,并在系统重启时自启。如需手动启动,请按以下步骤操作:  3.1 在Windows上启动TAS 1. 打开 Windows服务管理器: ◦ 按下 Win R&…...

Oracle测试题目及笔记(多选)

所有题目来自于互联网搜索 在以下概要文件的陈述中,哪两个是正确的? (D 和 E) A. 概要文件不能被用来为账户加锁 B. 概要文件不能被用来控制资源使用 C. 数据库管理员可以使用概要文件更改用户密…...

定制化突围:遨游防爆手机的差异化竞争策略

在石油、化工、矿山等危险作业场景中,随着工业智能化与安全生产需求的升级,行业竞争逐渐从单一产品性能的比拼转向场景化解决方案的深度较量。遨游通讯以九重防爆标准为技术底座,融合多模稳控系统与全景前瞻架构,开辟出"千行…...

c#清理释放内存

虽然c#具有内存管理和垃圾回收机制,但是在arcobjects二次开发嵌入到arcgis data reviewet还会报内存错误。需要强制清理某变量内存方法如下: 1设置静态函数ReleaseCom函数 public static void ReleaseCom(object o) { try{System.Runtime.InteropServices.Marsh…...

从入门到精通【MySQL】 JDBC

文章目录 📕1. 什么是JDBC📕2. JDBC的使用原理📕3. 使用JDBC具体步骤✏️3.1 标题获取MySQL驱动包并修改pom.xml文件✏️3.2 建立数据库连接✏️3.3 创建Statement✏️3.4 执行SQL语句✏️3.5 处理返回结果✏️3.6 释放资源和关闭连接 &#…...

Sigfox技术|独特的运营模式 + 超窄带技术 + 非授权频谱

在物联网(IoT)通信技术的快速发展中,低功耗广域网(LPWAN)成为了推动智能设备连接的重要基础技术之一。作为LPWAN中的一种专有通信协议,Sigfox以其低功耗和广覆盖的特点脱颖而出,在物联网应用中占…...

【Dify 前端源码解读系列】MDX 让 API 文档焕发生机

什么是 MDX? MDX 是一种强大的文档格式,它允许在 Markdown 内容中使用 JSX。这意味着你可以在 Markdown 的简洁语法中嵌入交互式组件,使文档不再局限于静态内容。MDX 完美地将 Markdown 的简单与 JSX 的灵活性结合在一起,特别适合需要丰富交互体验的文档场景。 MDX 的优势…...

docker能用来干什么的

最近项目像简快部署docker,但是发现源被隔离,暂时先记下,以后有机会再研究。 下面摘抄的网文网址如下:Docker能用来干什么的 ?_超级码客_海量程序员面试题库 | 笔试题库 | 面试求职考试神器 docker能用来干什么的 docker能用来做…...

dispaly: inline-flex 和 display: flex 的区别

display: inline-flex 和 display: flex 都是 CSS 中用于创建弹性盒子布局(Flexbox)的属性值,但它们之间有一些关键的区别,主要体现在元素如何在页面上被渲染和它们对周围元素的影响。 主要区别 1,块级 vs 行内块级 d…...

AI Agent系列(九) -Data Agent(数据分析智能体)

AI Agent系列【九】 前言一、Data Agent场景二、Data Agent核心因素2.1 数据源2.2 大模型2.3 应用及可视化 三、Data Agent应用场景 前言 Data Agent就是在大模型基础上构建一个数据分析的智能体,是一种基于人工智能技术,特别是大模型技术的数据分析智…...

【工具】视频翻译、配音、语音克隆于一体的一站式视频多语言转换工具~

Krillin AI 是全能型音视频本地化与增强解决工具。这款简约而强大的工具,集音视频翻译、配音、语音克隆于一身,支持横竖屏格式输出,确保在所有主流平台(哔哩哔哩,小红书,抖音,视频号&#xff0c…...

api护照查验-GO国内护照查验接口-身份安全卫士

在全球化浪潮汹涌的当下,跨境电子商务蓬勃发展,国际旅游持续升温,留学热潮也未曾减退。在这些跨越国界的活动背后,护照作为国际旅行的关键凭证,其真伪核验的重要性愈发凸显。护照查验接口,宛如一颗璀璨的新…...

在 Tailwind CSS 中优雅地隐藏滚动条

在开发中,我们经常需要隐藏滚动条但保持滚动功能,这在构建现代化的用户界面时很常见。 本文将介绍两种在 Tailwind CSS 项目中实现这一目标的方法,方便同学们记录和查阅。 方法一:使用 tailwind-scrollbar-hide 插件 这是一种更…...

【C++】深入浅出之继承

目录 继承的概念及定义继承的定义继承方式和访问限定符protected与private的区别 默认继承方式继承类模板基类和派生类对象赋值兼容转换继承中的作⽤域(隐藏关系)相关面试题⭐ 派生类的默认成员函数⭐构造函数拷贝构造赋值重载析构函数 继承与友元继承与静态成员继承的方式菱形…...

Linux软件仓库

Linux常见软件包类型: dbdDebian家族及Ubuntu等基于Debian的Linux操作系统所使用的软件包管理格式rpmRed Hat Linux、Fedora、openSUSE、Mandriva和Mageia等使用的标准软件包管理格式源代码软件包一般为“.tar.gz”、“.tar.bz2”等格式的压缩包包含程序的原始代码…...

Git创建分支操作指南

1. 创建新分支但不切换&#xff08;仅创建&#xff09; git branch <分支名>示例&#xff1a;创建一个名为 new-feature 的分支git branch new-feature2. 创建分支并立即切换到该分支 git checkout -b <分支名> # 传统方式 # 或 git switch -c <分支名&g…...

从基础概念到前沿应用了解机器学习

一、机器学习基础概念 1.机器学习定义与核心价值 机器学习是人工智能的重要分支&#xff0c;通过算法让计算机系统能够从数据中自动学习并改进性能。其核心价值在于&#xff1a; 自动化决策&#xff1a;无需显式编程即可完成复杂任务 持续进化&#xff1a;随着数据积累不断…...

跨平台嵌入式音视频开发指南:EasyRTC音视频通话的多场景适配与AI扩展能力

在数字化通信技术飞速发展的今天&#xff0c;实时音视频通信已成为众多智能设备和应用的核心功能。从智能家居到远程办公&#xff0c;从在线教育到智能安防&#xff0c;音视频通信技术的应用场景不断拓展&#xff0c;对低延迟、高稳定性和跨平台兼容性的需求也在持续增长。在这…...

停止回答 docker启动redis

在Docker中启动Redis服务器是一个相对直接的过程。下面是一些步骤和示例&#xff0c;帮助你在Docker容器中运行Redis。 步骤 1: 安装Docker 确保你的系统上已经安装了Docker。你可以从Docker官网下载并安装Docker。 步骤 2: 拉取Redis镜像 首先&#xff0c;你需要从Docker Hu…...

2025年4月16日华为留学生笔试第二题200分

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 02. 图书馆借阅管理系统 问题描述 卢小姐是一家大学图书馆的管理员,她需要开发一个简单的图书借阅管理系统来处理日常的图书流通操作。系统需要支持以下四种操作: in s:表示一本…...

0417 Langchain

Langchain就是&#xff0c;帮助大模型和外部计算、数据结合起来。 pip install langchain pip install langchain-openai 文档 登录并获取LangSmish&#xff08;监控&#xff09;的API key&#xff1a; 根据AI框架&#xff1a;Langchain的环境和监控_哔哩哔哩_bilibili htt…...

SQL Server 游标介绍

SQL Server 游标是用于对查询结果集进行逐行处理的数据库对象。下面从基本概念、使用步骤、示例代码、优缺点等方面详细介绍&#xff1a; 基本概念 游标提供了一种对从表中检索出的数据进行逐行操作的机制&#xff0c;它允许开发者在结果集中向前或向后移动&#xff0c;一次处…...

Linux:显示 -bash-4.2$ 问题(CentOS 7)

文章目录 一、原因二、错误示例三、解决办法 一、原因 在 CentOS 7 系统中&#xff0c;如果你看到命令行提示符显示为 -bash-4.2$&#xff0c;一般是 Bash shell 正在运行&#xff0c;并且它没有找到用户的个人配置文件&#xff0c;或者这些文件有问题而未能成功加载。这个提示…...

小数点舍入,round与Decimal的区别

两者对中间值&#xff08;5&#xff09;的处理不同 主要是精度问题 表面上是2.675 但是实际上不一定是2.675。 from decimal import Decimal, ROUND_HALF_UPprint(f{2.675:.20f}) print(f"{Decimal(f{2.675}):.20f}")# 使用 Python 内置的 round 函数进行四舍五入 …...

【华为】OSPF震荡引起CPU占用率高怎么解决?

原创&#xff1a;厦门微思网络 现象描述 如图所示&#xff0c;Switch_1、Switch_2、Switch_3和Switch_4配置了OSPF协议&#xff0c;发现Switch_1设备的CPU占用率高&#xff0c;ROUT任务占用率明显高于其他任务并且产生路由震荡。 故障组网图 原因分析 网络中IP地址冲突导致…...

2025年4月16日华为留学生笔试第三题300分

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 智慧城市网络优化 问题描述 K小姐是一家智慧城市服务提供商的网络架构师。她负责规划城市边缘计算节点的布局,以提供更快速、稳定的网络服务。 城市内有 n n...

禁用USB接口的电脑管理软件推荐

软件介绍 还在为同事随意插U盘拷贝文件而头疼&#xff1f;这款「USB守门员」堪称办公室数据防泄漏神器&#xff01;不到100KB的迷你体积&#xff0c;却能让你瞬间掌控电脑的USB权限&#xff0c;操作简单到连小白都能秒变“技术大佬”&#xff01; 禁用/启用&#xff0c;一键掌…...

FreeRTOS任务创建和删除简要概述

任务创建 函数原型&#xff1a;xTaskCreate()是创建任务的主要函数&#xff0c;其原型通常如下&#xff1a; BaseType_t xTaskCreate(TaskFunction_t pxTaskCode,const char * const pcName,const uint16_t usStackDepth,void * const pvParameters,UBaseType_t uxPriority,T…...

【C++初阶】第14课—缝合怪deque和优先队列、仿函数

文章目录 1. 双端队列deque1.1 认识deque1.2 deque的迭代器1.3 deque的常用接口1.4 deque的优缺点 2. 优先队列priority_queue2.1 认识priority_queue2.2 模拟实现优先队列priority_queue 3. 仿函数 在学习deque之前&#xff0c;回顾一下vector和list各自的优缺点 数据结构优点…...

通过helm在k8s中安装mysql 8.0.37

使用 Helm 在 Kubernetes 中安装 MySQL 8.0.37 是一个相对简单的过程。以下是详细步骤&#xff1a; 下载helm包 #添加 Helm 仓库 helm repo add bitnami https://charts.bitnami.com/bitnami#搜索mysql helm search repo mysql --versions NAME CHAR…...

人工智能 - browser-use:重新定义浏览器自动化的 AI 新范式

在浏览器自动化领域&#xff0c;Selenium 和 Playwright 等工具已成为开发者的标配。但随着网页复杂度的提升&#xff08;如动态渲染、反爬虫机制、验证码等&#xff09;&#xff0c;传统工具逐渐暴露出效率低、扩展性差的缺陷。browser-use 的出现&#xff0c;通过深度融合人…...

Langchain-简单Demo

支持的模型 官方示例&#xff1a; #OpenAI pip install -qU langchain-openai import getpass import os os.environ["OPENAI_API_KEY"] getpass.getpass() from langchain_openai import ChatOpenAI model ChatOpenAI(model"gpt-4") #Anthropic pip ins…...

怎样才能设计好的自动化测试用例

设计一个好的自动化测试用例&#xff0c;就像写一段“自解释的、高质量的代码”——它应该清晰、可靠、独立、易维护&#xff0c;而且对测试目标有价值。 ✅ 好的自动化测试用例应具备的 8 大特性&#xff1a; 特性解释示例&#x1f3af; 目标明确一个用例只验证一个点&#…...

NFC 碰一碰发视频源码搭建全流程详解,支持OEM

在移动互联网时代&#xff0c;便捷的数据传输方式备受关注。NFC&#xff08;近场通信&#xff09;技术以其操作简单、连接迅速的特点&#xff0c;为数据交互提供了新的可能。通过搭建 NFC 碰一碰发视频功能&#xff0c;用户只需将设备轻轻靠近&#xff0c;就能快速完成视频传输…...

vue入门:路由 router

文章目录 介绍安装配置路由模式嵌套路由路由传参编程式导航路由懒加载 底层原理 介绍 vue2 vue router API vue3 vue router API Vue Router 是 Vue.js 的官方路由管理器&#xff0c;它允许你通过不同的 URL 显示不同的组件&#xff0c;从而实现单页面应用&#xff08;SPA&a…...

运营商二要素认证 API 接口具有哪些的好处?

目录 一、提高认证准确性 1.数据真实性可靠 2.实时验证效率高 3.双重验证更精准 4.多场景适用性强 5.动态更新数据准 二、增强安全性 1.防止身份冒用 2.抵御欺诈行为 3.保障数据安全 4.强化业务安全 5.支持安全审计与追溯 三、提升用户体验 1.操作简便快捷 2.认…...

从GPT到Gemini 大模型进化史

从GPT到Gemini&#xff1a;大模型进化史 在过去的几年里&#xff0c;人工智能领域经历了翻天覆地的变化&#xff0c;其中最引人注目的莫过于大规模语言模型的发展。从最初的GPT系列到最近的Gemini&#xff0c;这些模型不仅在技术上取得了重大突破&#xff0c;还在实际应用中展…...

大模型时代下全场景数据消费平台的智能BI—Quick BI深度解析

一、前言 在数字化转型浪潮中&#xff0c;BI工具已成为企业数据驱动决策的核心引擎。Quick BI作为阿里云旗下的全场景数据消费平台&#xff0c;以其"让业务决策触手可及"的理念在市场中占据一席之地。通过Quick BI可以让企业的数据资产快速的流动起来&#xff0c;通…...

高防ip的原理

高防IP&#xff08;高防御IP地址&#xff09;是一种专门用于抵御大规模网络攻击的防护服务&#xff0c;其核心原理是通过​​流量清洗、协议分析与智能调度​​等技术&#xff0c;将恶意流量与正常业务流量分离&#xff0c;保障目标服务器或应用的可用性。以下是其核心技术原理…...