温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

查询计划是如何生成的呢

发布时间:2026-07-15 14:00:02 来源:亿速云 阅读:93 作者:小樊 栏目:数据库

“查询计划”(Query Plan,也叫执行计划)是数据库(或大数据引擎)在执行一条 SQL/查询语句前,生成的一种**“如何一步步取数据、怎么算、按什么顺序做”的方案**。
下面用通用原理 + 简化的生成流程来说明,不限定某一种数据库。


一、为什么需要查询计划?

SQL 是**“声明式语言”**:
你只告诉数据库“我要什么结果”,而不是“怎么算”。

例如:

SELECT *
FROM orders
WHERE user_id = 10
  AND order_date > '2024-01-01';

数据库需要决定:

  • 先过滤 user_id 还是 order_date
  • 用索引还是全表扫描?
  • 需不需要排序?
  • 表和索引的访问顺序是什么?

查询计划就是决策结果。


二、查询计划是怎么生成的?

一般分 4 个阶段


1️⃣ 解析(Parsing)

目标:把 SQL 文本变成结构化的语法树

过程:

  • 词法分析(识别 SELECT、FROM、WHERE 等)
  • 语法分析(检查 SQL 是否符合语法规则)
  • 生成 解析树(Parse Tree)

示例结构(概念化):

SELECT
 ├─ columns: *
 ├─ FROM: orders
 └─ WHERE
     ├─ user_id = 10
     └─ order_date > '2024-01-01'

✅ 这一阶段不关心数据在哪、怎么算


2️⃣ 逻辑优化(Logical Optimization)

目标:生成“语义等价但更高效”的逻辑执行方案

数据库会做很多“数学级别”的改写,例如:

常见的逻辑优化

  • 谓词下推(Predicate Pushdown)

    SELECT *
    FROM (SELECT * FROM orders)
    WHERE user_id = 10
    

    → 把 WHERE 提前到子查询里

  • 投影下推

    • 尽早去掉不需要的列
  • 子查询展开 / 视图展开

  • 连接顺序重排(逻辑层面)

  • 去除无效条件

✅ 结果:逻辑查询计划(Logical Plan)

它描述:

  • 做什么操作(join、filter、aggregate)
  • 不关心具体算法

3️⃣ 物理优化(Physical Optimization / Cost-Based Optimization)

这是查询计划生成的核心环节

关键问题

  • 用哪种算法?
  • 用不用索引?
  • 表的访问顺序?
  • 用 hash join 还是 nested loop join?

基于代价的优化(CBO, Cost-Based Optimizer)

数据库会估算:

  • 表的行数(cardinality)
  • 数据分布(statistics)
  • I/O 成本
  • CPU 成本
  • 内存使用

公式(概念化):

Cost = I/O 成本 + CPU 成本 + 网络 / 内存开销

数据库会生成 多个候选物理计划,选一个“看起来最便宜的”。


4️⃣ 生成最终执行计划(Execution Plan)

得到一个树状结构,例如(简化):

Index Scan (user_id_index)
 └── Filter (order_date > '2024-01-01')

执行时:

  • 从上到下
  • 从下到上
  • 或 pipeline 执行(流式)

三、查询计划长什么样?

MySQL / PostgreSQL / Oracle 为例,常见算子包括:

算子 含义
Seq Scan 全表扫描
Index Scan 索引扫描
Filter 条件过滤
Join 表连接
Sort 排序
Aggregate 聚合
Hash 哈希表
Nested Loop 嵌套循环

示例(概念):

Nested Loop
 ├─ Index Scan on users (user_id = 10)
 └─ Index Scan on orders (order_date > ...)

四、影响查询计划生成的关键因素

1️⃣ 统计信息是否准确

  • 表大小
  • 列的唯一值数
  • 数据分布

统计信息不准 → 选错计划 → 慢查询


2️⃣ 索引设计

  • 是否有合适索引
  • 联合索引顺序
  • 覆盖索引

3️⃣ SQL 写法

  • SELECT * vs 指定列
  • JOIN 条件
  • 函数包在条件上(可能导致索引失效)

4️⃣ 数据库引擎类型

  • OLTP(行存):偏向点查
  • OLAP(列存):偏向全表扫描 + 向量化

五、一句话总结

查询计划是数据库通过“解析 → 逻辑优化 → 基于代价的物理优化”生成的,用来决定“如何最高效地执行一条 SQL”的执行方案。


如果你愿意,我可以:

  • ✅ 对比 MySQL / PostgreSQL / Oracle / Spark SQL 的查询计划生成差异
  • ✅ 实际帮你 解读一条 SQL 的执行计划
  • ✅ 讲 为什么同一 SQL 有时会选不同查询计划

你可以直接把 SQL 或数据库类型发给我。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI