Man page - explain(7)
Manual
EXPLAIN
NAMESYNOPSIS
DESCRIPTION 描 述
PARAMETERS 参 数
NOTES 注 意
EXAMPLES 例 子
COMPATIBILITY 兼 容 性
译 者
跋
NAME
EXPLAIN - 显 示 语 句 执 行 规 划
SYNOPSIS
EXPLAIN [ ANALYZE ] [ VERBOSE ] statement
DESCRIPTION 描 述
这 条 命 令 显 示 PostgreSQL规 划 器 为 所 提 供 的 语 句 生 成 的 执 行 规 划 。 执 行 规 划 显 示 语 句 引 用 的 表 是 如 何 被 扫 描 的 --- 是 简 单 的 顺 序 扫 描 , 还 是 索 引 扫 描 等 --- 并 且 如 果 引 用 了 多 个 表 , 采 用 了 什 么 样 的 连 接 算 法 从 每 个 输 入 的 表 中 取 出 所 需 要 的 记 录 。
显 示 出 来 的 最 关 键 的 部 分 是 预 计 的 语 句 执 行 开 销 , 这 就 是 规 划 器 对 运 行 该 语 句 所 需 时 间 的 估 计 ( 以 磁 盘 页 面 存 取 为 单 位 计 量 ) 。 实 际 上 显 示 了 两 个 数 字 : 返 回 第 一 行 记 录 前 的 启 动 时 间 , 和 返 回 所 有 记 录 的 总 时 间 。 对 于 大 多 数 查 询 而 言 , 关 心 的 是 总 时 间 , 但 是 , 在 某 些 环 境 下 , 比 如 一 个 EXISTS 子 查 询 里 , 规 划 器 将 选 择 最 小 启 动 时 间 而 不 是 最 小 总 时 间 ( 因 为 执 行 器 在 获 取 一 条 记 录 后 总 是 要 停 下 来 ) 。 同 样 , 如 果 你 用 一 条 LIMIT 子 句 限 制 返 回 的 记 录 数 , 规 划 器 会 在 最 终 的 开 销 上 做 一 个 合 理 的 插 值 以 计 算 哪 个 规 划 开 销 最 省 。
ANALYZE 选 项 导 致 查 询 被 实 际 执 行 , 而 不 仅 仅 是 规 划 。 它 在 显 示 中 增 加 了 在 每 个 规 划 节 点 内 部 花 掉 的 总 时 间 ( 以 毫 秒 计 ) 和 它 实 际 返 回 的 行 数 。 这 些 数 据 对 搜 索 该 规 划 器 的 预 期 是 否 和 现 实 相 近 很 有 帮 助 。
Important:
要 记 住 的 是 查
询 实 际 上 在 使
用 ANALYZE 的 时 候 是
执 行 的 。 尽 管
EXPLAIN 会 抛 弃 任 何 SELECT
会 返 回 的 输 出
, 但 是 其 它 查
询 的 副 作 用 还
是 一 样 会 发 生
的 。 如 果 你 在
INSERT, UPDATE, DELETE, 或
者 EXECUTE 语 句 里 使
用 EXPLAIN ANALYZE, 而 且 还
不 想 让 查 询 影
响 你 的 数 据 ,
用 下 面 的 方 法
:
BEGIN;
EXPLAIN ANALYZE ...;
ROLLBACK;
PARAMETERS 参 数
ANALYZE
执 行 命 令 并 显 示 实 际 运 行 时 间 。
VERBOSE
显 示 规 划 树 完 整 的 内 部 表 现 形 式 , 而 不 仅 仅 是 一 个 摘 要 。 通 常 , 这 个 选 项 只 是 在 调 试 PostgreSQL 的 时 候 有 用 。 VERBOSE 输 出 可 能 是 打 印 得 工 整 的 , 也 可 能 不 是 , 具 体 取 决 于 配 置 参 数 explain_pretty_print。
statement
任 何 SELECT , INSERT , UPDATE , DELETE , EXECUTE , 或 DECLARE 语 句 。
NOTES 注 意
在 PostgreSQL 里 只 有 很 少 的 一 些 文 档 介 绍 有 关 优 化 器 计 算 开 销 的 问 题 。 参 考 Section 13.1 ‘‘Using EXPLAIN ’’ 获 取 更 多 信 息 。
为 了 让 PostgreSQL 查 询 规 划 器 在 优 化 查 询 的 时 候 做 出 合 理 的 判 断 , 我 们 需 要 运 行 ANALYZE 语 句 以 记 录 有 关 数 据 在 表 中 的 分 布 的 统 计 信 息 。 如 果 你 没 做 过 这 件 事 情 ( 或 者 如 果 自 上 次 ANALYZE 以 来 , 表 中 的 数 据 统 计 分 布 发 生 了 显 著 变 化 ) , 那 么 计 算 出 来 的 开 销 预 计 很 可 能 与 查 询 的 实 际 属 性 并 不 对 应 , 因 此 很 可 能 会 选 取 一 个 比 较 差 的 查 询 规 划 。
在 PostgreSQL 7.3 以 前 , 查 询 规 划 是 以 NOTICE 消 息 的 形 式 发 出 来 的 。 现 在 它 的 显 示 格 式 是 一 个 查 询 结 果 ( 格 式 化 成 了 类 似 一 个 有 单 个 文 本 字 段 的 表 。 )
EXAMPLES 例 子
显 示 一 个 对 只 有 一 个 int4 列 和 10000 行 的 表 的 简 单 查 询 的 查 询 规 划 :
EXPLAIN SELECT * FROM foo;
QUERY PLAN
---------------------------------------------------------
Seq Scan on foo (cost=0.00..155.00 rows=10000 width=4)
(1 row)
如 果 存 在 一 个 索 引 , 并 且 我 们 使 用 一 个 可 应 用 索 引 的 WHERE 条 件 的 查 询 , EXPLAIN 会 显 示 不 同 的 规 划 :
EXPLAIN SELECT * FROM foo WHERE i = 4;
QUERY PLAN
--------------------------------------------------------------
Index Scan using fi on foo (cost=0.00..5.98 rows=1 width=4)
Index Cond: (i = 4)
(2 rows)
下 面 是 一 个 使 用 了 聚 集 函 数 的 查 询 的 查 询 规 划 :
EXPLAIN SELECT sum(i) FROM foo WHERE i < 10;
QUERY PLAN
---------------------------------------------------------------------
Aggregate (cost=23.93..23.93 rows=1 width=4)
-> Index Scan using fi on foo (cost=0.00..23.92 rows=6
width=4)
Index Cond: (i < 10)
(3 rows)
下 面 是 一 个 使 用 EXPLAIN EXECUTE 显 示 一 个 已 准 备 好 的 查 询 规 划 的 例 子 :
PREPARE
query(int, int) AS SELECT sum(bar) FROM test
WHERE id > $1 AND id < $2
GROUP BY foo;
EXPLAIN ANALYZE EXECUTE query(100, 200);
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
HashAggregate (cost=39.53..39.53 rows=1 width=8) (actual
time=0.661..0.672 rows=7 loops=1)
-> Index Scan using test_pkey on test (cost=0.00..32.97
rows=1311 width=8) (actual time=0.050..0.395 rows=99
loops=1)
Index Cond: ((id > $1) AND (id < $2))
Total runtime: 0.851 ms
(4 rows)
注 意 这 里 显 示 的 数 字 , 甚 至 还 有 选 择 的 查 询 策 略 都 有 可 能 在 各 个 PostgreSQL版 本 之 间 不 同 --因 为 规 划 器 在 不 断 改 进 。 另 外 , ANALYZE 命 令 使 用 随 机 的 采 样 来 估 计 数 据 统 计 ; 因 此 , 一 次 新 的 ANALYZE 运 行 之 后 开 销 估 计 可 能 会 变 化 , 即 使 数 据 的 实 际 分 布 没 有 改 变 也 这 样 。
COMPATIBILITY 兼 容 性
在 SQL 标 准 中 没 有 EXPLAIN 语 句 。
译 者
Postgresql 中 文 网 站 何 伟 平 <laser@pgsqldb.org>
跋
本
页 面 中 文 版 由
中 文 man 手 册 页 计
划 提 供 。
中 文 man 手 册 页 计
划 :
https://github.com/man-pages-zh/manpages-zh