一条sql是如何执行的详解

ops/2024/9/23 0:48:01/

一条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. 结果返回

执行器生成的结果集会逐行或批量地返回给客户端,直到所有匹配的记录都返回。

示例:查询执行流程

假设你有一个简单的查询:

sql">SELECT name, salary FROM employees WHERE department_id = 10 ORDER BY salary DESC;
  1. SQL 解析

    • 解析器将 SQL 拆解为标识符:SELECTnamesalaryemployeesWHEREdepartment_idORDER BYDESC
    • 检查 employees 表是否存在,namesalarydepartment_id 是否是合法字段。
  2. 查询重写

    • 如果 employees 是一个视图,SQL 会被重写为查询基础表。
  3. 查询规划

    • PostgreSQL 会分析是否有适合 department_id 的索引。如果有索引,可以使用索引扫描来提高效率。
    • 生成多个候选计划,例如顺序扫描、索引扫描,并计算各自的成本。
    • 选择成本最低的计划。假设选择了索引扫描方式。
  4. 查询执行

    • 执行器根据选择的计划,使用索引扫描从 employees 表中查找 department_id = 10 的记录。
    • 过滤不符合条件的行。
    • 根据 salary 列对数据进行排序。
  5. 结果返回

    • salary 排序后的记录逐行返回给客户端。

总结

SQL 查询的执行过程分为解析、查询重写、查询规划、查询执行和结果返回五个主要步骤。每个步骤都对应特定的任务,从解析 SQL 到最终返回结果,确保查询尽可能高效地执行

 🌟感谢支持 听忆.-CSDN博客

🎈众口难调🎈从心就好


http://www.ppmy.cn/ops/114497.html

相关文章

【数学分析笔记】第3章第2节 连续函数(4)

3. 函数极限与连续函数 3.2 连续函数 3.2.9 反函数的连续性定理 【定理3.2.2】【反函数连续性定理】设 y f ( x ) yf(x) yf(x)在闭区间 [ a , b ] [a,b] [a,b]上连续且严格单调增加,设 f ( a ) α , f ( b ) β f(a)\alpha,f(b)\beta f(a)α,f(b)β&#xff0…

KTH5772系列 游戏手柄摇杆专用 3D霍尔位置传感器

KTH5772系列 游戏手柄摇杆专用 3D霍尔位置传感器 KTH5772AQ3QNS 产品概述 KTH5772 是一款专为游戏手柄上的摇杆应用而设计的 3D 霍尔磁感应芯片,主要面向对线性度、回报率、灵 敏度、功耗要求严格的摇杆应用。KTH5772 基于 3D 霍尔技术,内部分别集成了 …

算法-K个一组翻转链表

// 要实现没k个节点进行翻转的操作,可以按照一下步骤进行 // 1.计算链表长度 // 2.分组反转 // 3. 使用一个虚拟头节点来处理边界情况 // 4.每次处理k个节点进行反转 // 5.如果剩余节点不足k个 则保持原有顺序 // 6.依次反转每组中的节点 // 1.使用prevGroupEEnd追…

2024年三个月自学 网络安全(黑客技术)手册

🤟 基于入门网络安全/黑客打造的:👉黑客&网络安全入门&进阶学习资源包 前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、…

网络层协议 —— IP协议

目录 0.前言 1.IP协议的格式 2.IP地址 2.1IP地址的划分 国际间IP地址的划分 公有IP 私有IP 特殊的IP地址 国内IP地址的划分 2.2IP地址不足问题 2.3IP地址的功能 2.4如何使用IP地址 2.5IP地址的构成 3.网段划分 以前的方案 现在的方案 4.认识宏观网络 5.路由 …

瑞芯微RK3588开发板Linux系统添加自启动命令的方法,深圳触觉智能Arm嵌入式鸿蒙硬件方案商

本文适用于触觉智能所有Linux系统的开发板、主板添加自启动命令的方法,本次使用了触觉智能的EVB3588开发板演示,搭载了瑞芯微RK3588旗舰芯片。 该开发板为核心板加底板设计,为工业场景设计研发的模块化产品,10年以上稳定供货,帮助…

全面详尽的 PHP 环境搭建教程

目录 目录 PHP 环境搭建概述 在 Windows 上搭建 PHP 环境 使用集成环境 XAMPP 安装步骤 配置和测试 常用配置 手动安装 Apache、PHP 和 MySQL 安装 Apache 安装 PHP 安装 MySQL 配置 PHP 连接 MySQL 在 Linux 上搭建 PHP 环境 使用 LAMP 方案 安装 Apache 安装 …

【后端开发】JavaEE初阶—Theard类及常见方法—线程的操作(超详解)

前言: 🌟🌟本期讲解多线程的知识哟~~~,希望能帮到屏幕前的你。 🌈上期博客在这里:【后端开发】JavaEE初阶—线程的理解和编程实现-CSDN博客 🌈感兴趣的小伙伴看一看小编主页:GGBondl…