Man page - explain(7)

Manual

EXPLAIN

NAME
SYNOPSIS
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