支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4

F.3. auto_explain — 記錄執行緩慢查詢的執行計畫 #

auto_explain 模組提供一種自動記錄執行緩慢的語句的執行計畫的方法,而無需手動執行 EXPLAIN。這對於追蹤大型應用程式中未優化的查詢特別有用。

此模組不提供任何可透過 SQL 存取的函式。要使用它,只需將它載入到伺服器中。您可以將它載入到個別的工作階段

LOAD 'auto_explain';

(您必須是超級使用者才能執行此操作。) 更常見的用法是透過在 postgresql.conf 中包含 auto_explainsession_preload_librariesshared_preload_libraries 中,將它預先載入到部分或所有工作階段中。這樣,您就可以追蹤任何時候發生的意外緩慢的查詢。當然,這會產生額外的效能開銷。

F.3.1. 組態參數 #

有幾個組態參數可以控制 auto_explain 的行為。請注意,預設行為是不執行任何操作,因此如果您想要任何結果,則必須至少設定 auto_explain.log_min_duration

auto_explain.log_min_duration (integer) #

auto_explain.log_min_duration 是語句執行時間的最小值(以毫秒為單位),超過此值將導致記錄該語句的計畫。將其設定為 0 會記錄所有計畫。-1(預設值)會停用計畫的記錄。例如,如果您將其設定為 250ms,則所有執行時間為 250 毫秒或更長的語句都將被記錄。只有超級使用者才能變更此設定。

auto_explain.log_parameter_max_length (integer) #

auto_explain.log_parameter_max_length 控制查詢參數值的記錄。值 -1(預設值)會完整記錄參數值。0 會停用參數值的記錄。大於零的值會將每個參數值截斷為該位元組數。只有超級使用者才能變更此設定。

auto_explain.log_analyze (boolean) #

auto_explain.log_analyze 會導致在記錄執行計畫時印出 EXPLAIN ANALYZE 輸出,而不僅僅是 EXPLAIN 輸出。預設情況下,此參數已關閉。只有超級使用者才能變更此設定。

注意

當此參數開啟時,會對所有執行的語句進行每個計畫節點的計時,無論它們的執行時間是否足夠長以實際記錄。這可能會對效能產生極其負面的影響。關閉 auto_explain.log_timing 可以減輕效能成本,但會以減少資訊量為代價。

auto_explain.log_buffers (boolean) #

auto_explain.log_buffers 控制在記錄執行計畫時是否列印緩衝區使用統計資訊;它等同於 EXPLAINBUFFERS 選項。除非啟用 auto_explain.log_analyze,否則此參數無效。預設情況下,此參數已關閉。只有超級使用者才能變更此設定。

auto_explain.log_wal (boolean) #

auto_explain.log_wal 控制在記錄執行計畫時是否列印 WAL 使用統計資訊;它等同於 EXPLAINWAL 選項。除非啟用 auto_explain.log_analyze,否則此參數無效。預設情況下,此參數已關閉。只有超級使用者才能變更此設定。

auto_explain.log_timing (boolean) #

auto_explain.log_timing 控制在記錄執行計畫時是否列印每個節點的計時資訊;它等同於 EXPLAINTIMING 選項。重複讀取系統時脈的開銷可能會顯著降低某些系統上查詢的速度,因此,當只需要實際的列計數,而不需要精確的時間時,將此參數設定為 off 可能很有用。除非啟用 auto_explain.log_analyze,否則此參數無效。預設情況下,此參數已開啟。只有超級使用者才能變更此設定。

auto_explain.log_triggers (boolean) #

auto_explain.log_triggers 會在記錄執行計畫時,包含觸發程序(trigger)的執行統計資訊。 除非啟用 auto_explain.log_analyze,否則此參數無效。此參數預設為關閉。只有超級使用者才能變更此設定。

auto_explain.log_verbose (boolean) #

auto_explain.log_verbose 控制在記錄執行計畫時是否印出詳細資訊;它等同於 EXPLAINVERBOSE 選項。此參數預設為關閉。只有超級使用者才能變更此設定。

auto_explain.log_settings (boolean) #

auto_explain.log_settings 控制在記錄執行計畫時是否印出有關修改過的設定選項的資訊。只有影響查詢規劃且值與內建預設值不同的選項才會包含在輸出中。此參數預設為關閉。只有超級使用者才能變更此設定。

auto_explain.log_format (enum) #

auto_explain.log_format 選擇要使用的 EXPLAIN 輸出格式。 允許的值為 textxmljsonyaml。 預設為 text。 只有超級使用者才能變更此設定。

auto_explain.log_level (enum) #

auto_explain.log_level 選擇 auto_explain 將記錄查詢計畫的日誌等級。 有效值為 DEBUG5DEBUG4DEBUG3DEBUG2DEBUG1INFONOTICEWARNINGLOG。 預設值為 LOG。 只有超級使用者才能變更此設定。

auto_explain.log_nested_statements (boolean) #

auto_explain.log_nested_statements 使巢狀語句(在函數內執行的語句)被考慮記錄。 當它關閉時,只會記錄頂層查詢計畫。此參數預設為關閉。只有超級使用者才能變更此設定。

auto_explain.sample_rate (real) #

auto_explain.sample_rate 使 auto_explain 僅解釋每個會期(session)中一部分語句。 預設值為 1,表示解釋所有查詢。 對於巢狀語句,要麼全部解釋,要麼都不解釋。 只有超級使用者才能變更此設定。

在一般使用情況下,這些參數設定在 postgresql.conf 中,但超級使用者可以在自己的會期中隨時變更它們。 典型用法可能是

# postgresql.conf
session_preload_libraries = 'auto_explain'

auto_explain.log_min_duration = '3s'

F.3.2. 範例 #

postgres=# LOAD 'auto_explain';
postgres=# SET auto_explain.log_min_duration = 0;
postgres=# SET auto_explain.log_analyze = true;
postgres=# SELECT count(*)
           FROM pg_class, pg_index
           WHERE oid = indrelid AND indisunique;

這可能會產生如下的日誌輸出

LOG:  duration: 3.651 ms  plan:
  Query Text: SELECT count(*)
              FROM pg_class, pg_index
              WHERE oid = indrelid AND indisunique;
  Aggregate  (cost=16.79..16.80 rows=1 width=0) (actual time=3.626..3.627 rows=1 loops=1)
    ->  Hash Join  (cost=4.17..16.55 rows=92 width=0) (actual time=3.349..3.594 rows=92 loops=1)
          Hash Cond: (pg_class.oid = pg_index.indrelid)
          ->  Seq Scan on pg_class  (cost=0.00..9.55 rows=255 width=4) (actual time=0.016..0.140 rows=255 loops=1)
          ->  Hash  (cost=3.02..3.02 rows=92 width=4) (actual time=3.238..3.238 rows=92 loops=1)
                Buckets: 1024  Batches: 1  Memory Usage: 4kB
                ->  Seq Scan on pg_index  (cost=0.00..3.02 rows=92 width=4) (actual time=0.008..3.187 rows=92 loops=1)
                      Filter: indisunique

F.3.3. 作者 #

Takahiro Itagaki

提交更正

如果您在文件看到任何不正確、與您特定功能的使用經驗不符或需要進一步說明的內容,請使用此表單回報文件問題。