Provided by:
manpages-zh_1.5-1_all 
NAME
EXPLAIN - 顯示語句執行規劃
SYNOPSIS
EXPLAIN [ ANALYZE ] [ VERBOSE ] statement
DESCRIPTIONyz
這條命令顯示PostgreSQL規劃器為所提供的語句生成的執行規劃。
執行規劃顯示語句引用的表是如何被掃描的---
是簡單的順序掃描,還是索引掃描等 --- 並且如果引用了多茠瞴A
採用了什麼樣的連接算法從每蚇擗J的表中取出所需n的記錄。
顯示出來的最關鍵的部分是預p的語句執行開銷,
這就是規劃器對運行該語句所需時間的估p(以磁碟雇存取為單位p量)。
實際上顯示了兩蚍r:返回第一行記錄前的啟動時間,
和返回所有記錄的總時間。對於大多數查詢而言,關心的是總時間,但是,
在某些環境下,比如一 EXISTS 子查詢裏,
規劃器將選擇最小啟動時間而不是最小總時間(因為執行器在獲取一條記錄後總是-
n停下來)。 同樣,如果你用一條 LIMIT 子句制返回的記錄數,
規劃器會在最終的開銷上做一茼X理的插Hp算茬W劃開銷最省。
ANALYZE 選項導P查詢被實際執行,而不僅僅是規劃。 它在顯示中增加了在每-
茬W劃節點內部花掉的總時間(以毫秒p)和它實際返回的行數。
這些數據對搜索該規劃器的預期是否和現實相近很有幫助。
Important:
n記住的是查詢實際上在使用 ANALYZE 的時圇O執行的。 儘管 EXPLAIN
會拋棄任何 SELECT 會返回的輸出,
但是其它查詢的副作用還是一樣會發生的。 如果你在
INSERT,UPDATE,DELETE,或者 EXECUTE 語句裏使用 EXPLAIN
ANALYZE,而且還不想讓查詢影響你的數據, 用下悸漱隤k:
BEGIN;
EXPLAIN ANALYZE ...;
ROLLBACK;
PARAMETERS數
ANALYZE
執行命令並顯示實際運行時間。
VERBOSE
顯示規劃樹完整的內部表現形式,而不僅僅是一蚨Kn。通常,這-
蚇龠等u是在調試 PostgreSQL 的時啈野峞C VERBOSE
輸出可能是列印得工整的,也可能不是, 具體取決於配置參數
explain_pretty_print。
statement
任何 SELECT, INSERT, UPDATE, DELETE, EXECUTE, 或 DECLARE 語句。
NOTES`N
在 PostgreSQL 裏只有很少的一些文件介紹有關優化器p算開銷的問題。參考
Section 13.1 ``Using EXPLAIN'' 獲取更多信息。
為了讓 PostgreSQL 查詢規劃器在優化查詢的時埶等X合理的判斷, 我抳愯運行
ANALYZE 語句以記錄有關數據在表中的分布的統p信息。
如果你沒做過這件事情(或者如果自上次 ANALYZE 以來, 表中的數據統-
p分布發生了顯著變化),那麼p算出來的開銷預-
p很可能與查詢的實際屬性並不對應, 因此很可能會選取一茪騆差的查詢規劃。
在 PostgreSQL 7.3 以前,查詢規劃是以 NOTICE 消息的形式發出來的。
現在它的顯示格式是一茯d詢結果(格式化成了類似一茼陶窲文本字段的表。)
EXAMPLESl
顯示一蚢鴷u有一 int4 列和 10000 行的表的簡單查詢的查詢規劃:
EXPLAIN SELECT * FROM foo;
QUERY PLAN
---------------------------------------------------------
Seq Scan on foo (cost=0.00..155.00 rows=10000 width=4)
(1 row)
如果存在一荅薑煄A並且我怢洏峇@茈i應用索引的 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)
下惇O一茖洏峇F聚集函數的查詢的查詢規劃:
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)
下惇O一茖洏 EXPLAIN EXECUTE 顯示一茪w準備好的查詢規劃的例子:
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
命令使用隨機的採樣來估p數據統p; 因此,一次新的 ANALYZE 運行之後開銷估-
p可能會變化, 即使數據的實際分布沒有改變也這樣。
COMPATIBILITYe性
在 SQL 標準中沒有EXPLAIN 語句。
者
Postgresql <laser@pgsqldb.org>