2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 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_explain 包含在 session_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 選項。在某些系統上,重複讀取系統時鐘的開銷會顯著減慢查詢速度,因此在只需要實際行數而不關心精確時間時,將此引數設定為關閉可能很有用。此引數僅在 auto_explain.log_analyze 啟用時才有效。此引數預設開啟。只有超級使用者才能更改此設定。

auto_explain.log_triggers (boolean) #

auto_explain.log_triggers 會在記錄執行計劃時包含觸發器執行的統計資訊。此引數僅在 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 只解釋每個會話中的一部分語句。預設值為 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.00 loops=1)
    ->  Hash Join  (cost=4.17..16.55 rows=92 width=0) (actual time=3.349..3.594 rows=92.00 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.00 loops=1)
          ->  Hash  (cost=3.02..3.02 rows=92 width=4) (actual time=3.238..3.238 rows=92.00 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.00 loops=1)
                      Filter: indisunique

F.3.3. 作者 #

Takahiro Itagaki

提交更正

如果您在文件中發現任何不正確的內容、與您使用該功能的實際情況不符或需要進一步說明的內容,請使用 此表單 報告文件問題。