跳转到主要内容
模块 10 · 第 2 课(共 4)课程中的38/57~15 min
模块课程(2/4)

解释和分析

您是否想知道数据库如何选择是否使用您刚刚创建的索引? 一旦您在查询上按下 Enter 键(例如,带有链式分组依据的长连接),查询规划器就会动态计算数十种策略来执行查询,并选择理论上认为最快的策略。

但作为开发人员,您需要能够洞察查询规划器的黑暗思想。

解释

要了解 Planner 打算如何继续,只需将魔术词 EXPLAIN 放在查询的开头即可。

SQL
EXPLAIN SELECT * FROM orders WHERE status = 'delivered';

结果不会是订单!相反,您将在输出中看到计划(带有估计的统计信息):

Code
Seq Scan on orders  (cost=0.00..25.88 rows=15 width=40)
  Filter: (status = 'delivered'::text)

这告诉我们:

  1. Planner 将使用 Seq Scan(对整个磁盘进行暴力、顺序读取)。如果有数十亿的订单就糟糕了。
  2. 估计将返回约 15 行,并计算预加载 CPU 周期的“成本”。

解释分析

虽然 EXPLAIN 依赖于算法猜测(基于过去几个小时对数据计算的全局统计信息),但 EXPLAIN ANALYZE 实际上运行真实的查询(并等待完整的逻辑结果),以数学绝对术语比较实际经过的时间。

SQL
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 90;
Code
Index Scan using idx_orders_cust on orders  (cost=0.15..8.13 rows=4 width=40) (actual time=0.012..0.015 rows=4 loops=1)
  Index Cond: (customer_id = 90)
Planning Time: 0.081 ms
Execution Time: 0.033 ms

万岁!在这里,您了解到数据库已决定对我们的辅助 idx_orders_cust 索引应用索引扫描,执行时间仅为千分之一秒,动态跳过数百万行。

轮到你了

锻炼#sql.m10.l2.e1
尝试:0加载中...

编写一个基本的 EXPLAIN 命令来了解 PostgreSQL 打算如何查找当前库存低于 10 件的产品。 (请勿在此步骤中使用 ANALYZE。)

正在加载编辑器...
显示提示

只需在现有语句的开头添加 EXPLAIN 一词即可。

3 次尝试后可用的解决方案

获取真实的指标

锻炼#sql.m10.l2.e2
尝试:0加载中...

我们需要真正的性能诊断(时间和周期),而不是数学上猜测的草图。\n使用专用语句通过实际运行来研究 2025 年 1 月 1 日之前注册的所有“客户”的查找 ('signed_up_on' < '2025-01-01')。

正在加载编辑器...
显示提示

在解释之后添加“分析”一词。

3 次尝试后可用的解决方案