第7章学习笔记:查询处理与优化
课程笔记看懂执行算子、连接算法、统计估计和计划选择,用证据而非口诀调优。
关联:章节 第7章 查询处理与优化
第7章笔记:查询处理与优化
本章不是七个并列名词
看懂执行算子、连接算法、统计估计和计划选择,用证据而非口诀调优。 学习顺序从《从 SQL 到物理计划》开始,到《系统化查询调优工作流》闭合。每一节都要留下下一节能直接使用的对象:模式、关系、查询结果、页、计划、事务状态、日志记录或部署证据。若你只能逐条背定义,却说不清前一节输出怎样成为后一节输入,这一章还没有真正连起来。
七节依赖与例题
1. 从 SQL 到物理计划
要解决的问题: 解析树先经绑定与逻辑重写,再把关系算子映射为扫描、过滤、排序、聚合和连接等物理算子。
跟着做: 同一 JOIN 可选择索引嵌套循环、哈希连接或排序归并,优化器按估算成本而非 SQL 书写顺序决定。
验收规则: 等价不等于等成本;计划必须同时保持语义、NULL 规则和重复语义。
2. 顺序扫描与索引扫描成本
要解决的问题: 索引扫描省不省 I/O 取决于选择率和聚簇性;返回比例很高时随机回表可能比顺序扫描更贵。
跟着做: 百万行表查询 40% 数据,非聚簇索引可能触发大量随机页访问,优化器选全表扫描并非失效。
验收规则: 估算成本 ≈ 索引层 I/O + 命中 RID 对应的数据页 I/O;后者受聚簇因子影响。
3. 嵌套循环、哈希与归并连接
要解决的问题: 嵌套循环适合小外表加内表索引,哈希适合等值连接,归并适合已有序输入或范围条件;内存不足都会溢写。
跟着做: 小型部门表连接百万员工且员工 dept_id 有索引,可索引嵌套循环;两张大无序表等值连接通常哈希更合适。
验收规则: 块嵌套循环 I/O 约 B(R)+ceil(B(R)/(M−2))·B(S)。
4. 基数估计与统计信息
要解决的问题: 优化器用行数、不同值数、直方图和相关性估算选择率;独立均匀假设失真会让后续连接误差级联。
跟着做: 城市与邮编高度相关,分别估选择率再相乘会严重低估;多列统计或扩展统计可修正。
验收规则: 等值谓词选择率常近似 1/V(A),但倾斜分布应使用频率或直方图。
5. 等价变换与谓词下推
要解决的问题: 选择下推、投影裁剪和连接重排可减少中间结果,但外连接、聚合、窗口与易变函数会限制安全改写。
跟着做: 对内连接把只依赖订单表的日期过滤提前,可先缩小订单;对左连接把右表条件乱下推可能改变保留行。
验收规则: 改写前先证明结果多重集与 NULL 语义等价,再比较成本。
6. EXPLAIN 与实际执行证据
要解决的问题: EXPLAIN 展示估算,EXPLAIN ANALYZE 展示实际行数与时间;调优要找第一个估算大幅偏离或耗时异常节点。
跟着做: 某连接估 10 行实际 10 万行,先修统计或谓词相关性,而不是盲目给最终排序加索引。
验收规则: 误差倍率 = actual_rows / estimated_rows;沿计划自底向上找最早的数量级偏差。
7. 系统化查询调优工作流
要解决的问题: 先固定慢查询与参数,记录基线,再检查语义、等待、计划和数据分布,一次只改一个变量并验证回归。
跟着做: 优化报表前保存原结果哈希与关键样例;新索引上线后同时观测读延迟、写延迟、空间和计划稳定性。
验收规则: 调优完成标准是正确性不变、代表性负载改善、退化风险可监控且能回滚。
章内共同推理方法
先写“一行或一个状态代表什么”,再写它必须满足的键、约束、顺序或故障假设。遇到 SQL,先定结果粒度和重复/NULL 语义,再编码;遇到存储与优化,先估算页数、基数和 I/O,再看真实执行计划;遇到事务与分布式,先画时间线和允许历史,再讨论隔离级别、日志或共识。任何公式都要带单位、数据分布和适用边界。
可复现练习
从本章七个例题中任选两个,用 SQLite 或课程给定模型从空环境重做。保存建表/输入、执行步骤、实际输出和断言;随后故意加入一个重复键、NULL、并发交错、崩溃点、倾斜分布或网络分区,记录第一个被破坏的不变量。只截成功界面、只贴 SQL 或只报告耗时不算完成。
闭卷验收
用十分钟画出本章七节箭头图;任选一条箭头解释传递的具体字段、状态或证据。再为《系统化查询调优工作流》写一个最小失败案例,并追溯它需要《从 SQL 到物理计划》中的哪条定义才能修复。最后列出三道题:一道唯一答案判断、一道多条件选择、一道必须计算或写 SQL/状态轨迹的问题,且每题都写清为什么其他答案错。