一条sql是如何执行的详解
一条sql是如何执行的详解
1. SQL 解析(Parsing)
2. 查询重写(Query Rewrite)
3. 查询规划(Query Planning)
4. 查询执行(Query Execution)
5. 结果返回
示例:查询执行流程
总结
🎈边走、边悟🎈迟早会好 |
一条 SQL 查询在 PostgreSQL(以及大多数关系型数据库)中的执行过程可以分为多个阶段。每个阶段都对应特定的任务,从 SQL 解析到最终获取查询结果。以下是 SQL 查询执行过程的详细拆解:
1. SQL 解析(Parsing)
当用户提交一条 SQL 语句后,PostgreSQL 首先进入解析阶段。这个阶段主要有以下几个步骤:
- 词法分析:首先,SQL 语句被分解为单独的词法单元(tokens),如关键字、表名、列名、操作符等。
- 语法分析:接下来,解析器(parser)根据 SQL 语法规则,检查 SQL 语句是否符合 SQL 语法。例如,
SELECT
是否紧跟着字段名等。 - 语义分析:如果语法检查通过,系统会进行语义分析。例如,验证表名和列名是否存在于数据库的元数据中。
输出:在这个阶段,SQL 语句被转换为一个内部的解析树(parse tree)。
2. 查询重写(Query Rewrite)
在解析树生成后,PostgreSQL 会检查是否有任何规则(rules)适用,并根据这些规则对查询进行重写。重写规则(如视图的定义)可能会改变原始的 SQL 查询,生成新的查询树。
例如:
- 当你查询视图时,查询会被重写为对基础表的查询。
- 应用触发器或规则也可能会重写查询。
输出:生成经过重写的查询树。
3. 查询规划(Query Planning)
这个阶段,查询规划器(Query Planner)负责将重写后的查询树转换为执行计划。查询规划器会决定如何最有效地访问数据,主要涉及以下步骤:
- 候选执行计划生成:查询规划器生成多个可能的执行计划。例如:
- 使用顺序扫描(Sequential Scan)扫描表中的所有行。
- 使用索引扫描(Index Scan)根据索引快速定位数据。
- 是否需要执行连接(JOIN)操作,以及选择哪种连接算法(嵌套循环、哈希连接、归并连接)。
- 成本估算(Cost Estimation):查询规划器会为每个候选计划估算成本。成本基于以下因素:
- I/O 成本:数据从磁盘读取到内存的成本。
- CPU 成本:处理每行数据的计算成本。
- 行数估计:查询中每个步骤的结果集大小估计。
PostgreSQL 使用统计信息(如表中行的数量、索引的选择性、列的分布等)来进行成本估算。
- 选择最佳计划:根据每个执行计划的估算成本,选择成本最低的执行计划。
输出:生成最终的执行计划(execution plan),这是系统决定如何执行查询的详细步骤。
4. 查询执行(Query Execution)
一旦执行计划确定下来,查询执行器(Query Executor)开始按照计划一步步执行操作。主要的执行步骤包括:
-
扫描(Scan):执行器按照计划选择的扫描方式(如顺序扫描、索引扫描)读取数据。
- 如果是顺序扫描,则逐行读取表中的数据。
- 如果是索引扫描,则使用索引来定位特定的行。
-
过滤(Filter):对于每一行数据,执行器会根据
WHERE
子句条件进行过滤,确保仅保留符合条件的行。 -
连接(Join):如果查询涉及多个表,执行器会根据选择的连接算法(如嵌套循环连接、哈希连接)对这些表的数据进行连接处理。
-
排序(Sort)和分组(Group):如果查询要求对数据进行排序(
ORDER BY
)或分组(GROUP BY
),执行器会在获取数据后进行这些操作。 -
投影(Projection):执行器会根据
SELECT
子句中的字段选择要返回的列,并忽略未被选中的列。 -
返回结果:最终结果集根据执行计划一步步执行并返回给客户端。
5. 结果返回
执行器生成的结果集会逐行或批量地返回给客户端,直到所有匹配的记录都返回。
示例:查询执行流程
假设你有一个简单的查询:
SELECT name, salary FROM employees WHERE department_id = 10 ORDER BY salary DESC;
-
SQL 解析:
- 解析器将 SQL 拆解为标识符:
SELECT
、name
、salary
、employees
、WHERE
、department_id
、ORDER BY
、DESC
。 - 检查
employees
表是否存在,name
、salary
、department_id
是否是合法字段。
- 解析器将 SQL 拆解为标识符:
-
查询重写:
- 如果
employees
是一个视图,SQL 会被重写为查询基础表。
- 如果
-
查询规划:
- PostgreSQL 会分析是否有适合
department_id
的索引。如果有索引,可以使用索引扫描来提高效率。 - 生成多个候选计划,例如顺序扫描、索引扫描,并计算各自的成本。
- 选择成本最低的计划。假设选择了索引扫描方式。
- PostgreSQL 会分析是否有适合
-
查询执行:
- 执行器根据选择的计划,使用索引扫描从
employees
表中查找department_id = 10
的记录。 - 过滤不符合条件的行。
- 根据
salary
列对数据进行排序。
- 执行器根据选择的计划,使用索引扫描从
-
结果返回:
- 按
salary
排序后的记录逐行返回给客户端。
- 按
总结
SQL 查询的执行过程分为解析、查询重写、查询规划、查询执行和结果返回五个主要步骤。每个步骤都对应特定的任务,从解析 SQL 到最终返回结果,确保查询尽可能高效地执行
🌟感谢支持 听忆.-CSDN博客
🎈众口难调🎈从心就好 |
相关文章:
一条sql是如何执行的详解
一条sql是如何执行的详解 1. SQL 解析(Parsing) 2. 查询重写(Query Rewrite) 3. 查询规划(Query Planning) 4. 查询执行(Query Execution) 5. 结果返回 示例:查询执…...

“先天项目经理圣体”丨超适合做项目经理的4种人
总有人在问,什么样的人适合做项目经理,当项目经理需要什么样的特质? 你别说,还真有那么一些人是“先天项目经理圣体”,天生就是吃项目经理这碗饭的。 沟通达人丨靠“嘴”走天下 我们知道项目经理大部分的时间都在进行…...
如何从object中抽取某几个值,然后转换成数组
可以使用Object.entries(), Array.prototype.filter()和Array.prototype.map()或者解构赋值的方式从对象中抽取某些值并转换为数组 示例 1:使用 Object.entries(), filter() 和 map() const obj {a: 1,b: 2,c: 3,d: 4 };const keysToExtract [a, c];const extr…...

数据结构(14)——哈希表(1)
欢迎来到博主的专栏:数据结构 博主ID:代码小豪 文章目录 哈希表的思想映射方法(哈希函数)除留余数法 哈希表insert闭散列负载因子扩容find和erase 哈希表的思想 在以往的线性表中,查找速度取决于线性表是否有序&#…...
K近邻算法_分类鸢尾花数据集
import numpy as np import pandas as pd from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score1.数据预处理 iris load_iris() df pd.DataFrame(datairis.data, columnsiris.featur…...
nacos和eureka的区别详解
Nacos 和 Eureka 都是服务发现和注册中心的解决方案,但它们在功能、设计和使用场景上有所不同。以下是它们的详细区别: 1. 基本概念 Eureka:是由 Netflix 开发的服务发现工具。它主要用于 Java 微服务架构中的服务注册与发现。Eureka 通过 R…...
AI大模型包含哪些些技术?
Prompt Prompt提示是模型接收以生成响应或完成任务的初始文本输入。 我们给AI一组Prompt输入,用于指导模型生成响应以执行任务。这个输入可以是一个问题、一段描述、一组关键词,或任何其他形式的文本,用于引导模型产生特定内容的响应。 Tra…...

分布式技术概览
文章目录 分布式技术1. 分布式数据库(Distributed Databases)2. 分布式文件系统(Distributed File Systems)3. 分布式哈希表(Distributed Hash Tables, DHTs)4. 分布式缓存(Distributed Caching…...

动手学习RAG: moka-ai/m3e 模型微调deepspeed与对比学习
动手学习RAG: 向量模型动手学习RAG: moka-ai/m3e 模型微调deepspeed与对比学习动手学习RAG:迟交互模型colbert微调实践 bge-m3 1. 环境准备 pip install transformers pip install open-retrievals注意安装时是pip install open-retrievals,但调用时只…...

Nacos rce-0day漏洞复现(nacos 2.3.2)
Nacos rce-0day漏洞复现(nacos 2.3.2) NACOS是 一个开源的服务发现、配置管理和服务治理平台,属于阿里巴巴的一款开源产品。影像版本:nacos2.3.2或2.4.0版本指纹:fofa:app“NACOS” 从 Github 官方介绍文档可以看出国…...

yjs04——matplotlib的使用(多个坐标图)
1.多个坐标图与一个图的折线对比 1.引入包;字体(同) import matplotlib.pyplot as plt import random plt.rcParams[font.family] [SimHei] plt.rcParams[axes.unicode_minus] False 2.创建幕布 2.1建立图层幕布 一个图:plt.fig…...

MOS管和三极管有什么区别?
MOS管是基于金属-氧化物-半导体结构的场效应晶体管,它的控制电压作用于氧化物层,通过调节栅极电势来控制源漏电流。MOS管是FET中的一种,现主要用增强型MOS管,分为PMOS和NMOS。 MOS管的三个极分别是G(栅极),D(漏极)&…...

医院多参数空气质量监控和压差监测系统简介@卓振思众
在现代医院管理中,确保患者和医疗人员的健康与安全是首要任务。为实现这一目标,医院需要依赖高科技设施来维持最佳的环境条件。特别是,多参数空气质量监测系统和压差监测系统在这一方面发挥了不可替代的作用。【卓振思众】多参数空气质量监测…...

[项目实战]EOS多节点部署
文章总览:YuanDaiMa2048博客文章总览 EOS多节点部署 (一)环境设计(二)节点配置(三)区块信息同步(四)启动节点并验证同步EOS单节点的环境如何配置 (一…...
setImmediate() vs setTimeout() 在 JavaScript 中的区别
setImmediate() vs setTimeout() 在 JavaScript 中的区别 在 JavaScript 中,setImmediate() 和 setTimeout() 都用于调度任务,但它们的工作方式不同。 JavaScript 的异步特性 JavaScript 以其非阻塞、异步行为而闻名,尤其是在 Node.js 环境…...

【Java文件操作】文件系统操作文件内容操作
文件系统操作 常见API 在Java中,File类是用于文件和目录路径名的抽象表示。以下是一些常见的方法: 构造方法: File(String pathname):根据给定的路径创建一个File对象。File(String parent, String child):根据父路径…...

关于若依flowable的安装
有个项目要使用工作流功能,在网上看了flowable的各种资料,最后选择用若依RuoYi-Vue-Flowable这个项目来迁移整合。 一、下载项目代码: 官方项目地址:https://gitee.com/shenzhanwang/Ruoyi-flowable/ 二、新建数据库ÿ…...
猜数字困难版(1-10000)
小游戏,通过提示每次猜高或猜低以及每次猜中的位数,10次内猜中1-10000的一个数。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthde…...
ASPICE术语表
术语来源描述活动Automotive SPICE V4.0由利益相关方或参与方执行的任务用参数Automotive SPICE V4.0应用参数是包含了在系统或软件层级可被更改的数据的软件变量,他们影响系统或软件的行为和属性。应用参数的概念有两种表达方式:规范(分别包括变量名称、值域范围、…...
Knife4j:打造优雅的SpringBoot API文档
1. 为什么需要API文档? 在现代软件开发中,API文档的重要性不言而喻。一份清晰、准确、易于理解的API文档不仅能够提高开发效率,还能降低前后端沟通成本。今天,我们要介绍的Knife4j正是这样一款强大的API文档生成工具,它专为Spring Boot项目量身打造,让API文档的生成…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...