来源:markus-winand · 原文

这部分虽然被放在附录,但我一点也不觉得它像附属内容。恰恰相反,它更像前面所有索引原则真正落地时的验证器,没有它,前面的判断很容易重新退回感觉流。

为什么它是附录却非常重要

这部分虽然被放在附录,但其实是整本书的诊断工具箱。作者把 execution plan 视为数据库执行 SQL 的“汇编结果”,真正的调优必须从这里看起。我很喜欢这个比喻,因为它让执行计划不再像一个 DBA 专属黑箱。

这部分教会我的核心区分

  • Access predicate:决定扫描边界;
  • Filter predicate:扫描后再过滤;
  • Index scan 与 table access:必须分开看,不能因为“用了索引”就默认已经高效;
  • 行数估算与成本值:优化器所有选择都建立在这些估算之上。

跨数据库阅读方式

作者分别解释了 Db2、MySQL、Oracle、PostgreSQL、SQL Server、SQLBase、SQLite 的输出差异,但底层阅读方法是一致的:

  • 看它从哪张表开始;
  • 看访问路径是否被真正收紧;
  • 看哪里发生排序、聚合或回表;
  • 看谓词到底在哪个阶段才生效。

这一部分的真正价值

它把“感觉某条 SQL 很慢”转化成了可验证问题:慢在哪一步、扫描了多少、为什么没有更早过滤、为什么排序没有被索引消掉。 这正是我想从这类来源里得到的东西:把模糊直觉压成可检查的问题列表。


相关页面:use-the-index-luke · sql-execution-plans · query-shape-and-index-usage · sql-join-performance