Provided by: manpages-zh_1.5-1_all bug

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>