0Pricing
SQL Academy · 课时

ANALYZE 与 pg_statistic

使用 ANALYZE 保持规划器统计信息最新,检查 pg_statistic,并为相关列使用扩展统计信息

ANALYZE 与 pg_statistic 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。

为什么需要 ANALYZE

查询规划器需要估算行数和选择率,才能选择合适的计划。这些估算值来自 ANALYZE 收集的按列统计信息。

何时运行 ANALYZE

自动 VACUUM 会根据行变更阈值自动运行 ANALYZE。在批量加载或大量 DELETE 之后,请手动运行它,以免查询计划变差:

ANALYZE orders;
ANALYZE (VERBOSE) orders;

采样

ANALYZE 会为每列采样几百行。如果默认值产生了较差的估算结果,请调整统计信息目标值:

ALTER TABLE orders ALTER COLUMN customer_id SET STATISTICS 1000;
-- Up from default 100. ANALYZE will sample more rows.

pg_statistic

用于存放统计信息的系统目录(使用 pg_stats 视图可提高可读性):

SELECT attname, n_distinct, most_common_vals, most_common_freqs, histogram_bounds
FROM pg_stats
WHERE schemaname = 'public' AND tablename = 'orders';

规划器关注的内容

  • n_distinct——不同值的数量
  • most_common_vals——最常见的值及其频率
  • histogram_bounds——用于范围查询的桶
  • correlation——物理顺序与逻辑顺序的相关性(会影响扫描成本)

扩展统计信息

按列统计信息无法体现列之间的相关性。CREATE STATISTICS 可以捕获这些相关性:

CREATE STATISTICS orders_country_status (dependencies)
  ON country, status FROM orders;
ANALYZE orders;

-- Now the planner knows that  country='US' AND status='paid' is correlated
-- (e.g. most US orders happen to be 'paid').

多变量统计信息类型

  • dependencies——函数依赖(一个列可以预测另一个列)
  • ndistinct——不同值的组合数量
  • mcv——最常见的组合值(PG 12 及更高版本)

错误估算 → 错误计划

“为什么我的查询很慢”最常见的原因是行数估算错误。规划器预计只有 1 行,因此选择了嵌套循环;但实际有 1,000,000 行。

EXPLAIN ANALYZE SELECT * FROM ... ;
-- Look at Plan rows vs actual rows. Big gap = run ANALYZE or add extended stats.

在迁移中强制运行 ANALYZE

大量批量加载之后:

COPY users FROM ... ;
ANALYZE users;
-- Without ANALYZE, the planner has no idea the table just grew.

数据偏斜时统计信息不会自动更新

如果今天的数据与昨天的数据差异很大,那么在自动分析触发之前,统计信息可能仍然过时。数据形态发生变化后,请手动运行 ANALYZE。

pg_class.reltuples

规划器还会使用来自 pg_class 的估算行数。该值由 VACUUM/ANALYZE 更新。检查起来很快:

SELECT relname, reltuples FROM pg_class WHERE relname = 'orders';

总结

ANALYZE 为规划器提供数据。

  • 在数据发生重大变化后运行
  • 为数据偏斜的列提高 STATISTICS 目标值
  • 使用 CREATE STATISTICS 捕获列之间的相关性
  • 估算值与实际值差距很大时,应首先修复这一问题

快速检查

EXPLAIN ANALYZE 显示单列 WHERE 条件的估算行数为 1,但实际行数为 500,000。首先应如何修复?

常见问题解答

「ANALYZE 与 pg_statistic」课时是免费的吗?

是的 — 「ANALYZE 与 pg_statistic」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「ANALYZE 与 pg_statistic」这节课中我会学到什么?

使用 ANALYZE 保持规划器统计信息最新,检查 pg_statistic,并为相关列使用扩展统计信息 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「ANALYZE 与 pg_statistic」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Academy 课中编写并运行代码吗?

能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. MVCC 与膨胀成因
  2. VACUUM、autovacuum、vacuum_cost_delay
  3. ANALYZE 与 pg_statistic
  4. 仅索引扫描与可见性映射
← 返回 SQL Academy