auto_explain
模組提供了一種自動記錄慢語句執行計劃的方法,而無需手動執行 EXPLAIN。這對於跟蹤大型應用程式中未最佳化的查詢非常有幫助。
該模組不提供 SQL 可訪問的函式。要使用它,只需將其載入到伺服器中。您可以將其載入到單個會話中
LOAD 'auto_explain';
(您必須是超級使用者才能執行此操作。) 更常見的用法是透過在 postgresql.conf
中將 auto_explain
包含在 session_preload_libraries 或 shared_preload_libraries 中,將其預載入到部分或所有會話中。然後,您可以跟蹤任何時候發生的意外慢查詢。當然,這會帶來額外的開銷。
有幾個配置引數控制著 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
控制在記錄執行計劃時是否列印緩衝區使用統計資訊;這相當於 EXPLAIN
的 BUFFERS
選項。此引數僅在 auto_explain.log_analyze
啟用時才有效。此引數預設關閉。只有超級使用者才能更改此設定。
auto_explain.log_wal
(boolean
) #auto_explain.log_wal
控制在記錄執行計劃時是否列印 WAL 使用統計資訊;這相當於 EXPLAIN
的 WAL
選項。此引數僅在 auto_explain.log_analyze
啟用時才有效。此引數預設關閉。只有超級使用者才能更改此設定。
auto_explain.log_timing
(boolean
) #auto_explain.log_timing
控制在記錄執行計劃時是否列印每個節點的計時資訊;這相當於 EXPLAIN
的 TIMING
選項。在某些系統上,重複讀取系統時鐘的開銷會顯著減慢查詢速度,因此在只需要實際行數而不關心精確時間時,將此引數設定為關閉可能很有用。此引數僅在 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
控制在記錄執行計劃時是否列印詳細資訊;這相當於 EXPLAIN
的 VERBOSE
選項。此引數預設關閉。只有超級使用者才能更改此設定。
auto_explain.log_settings
(boolean
) #auto_explain.log_settings
控制在記錄執行計劃時是否列印有關已修改配置選項的資訊。輸出中僅包含影響查詢計劃且其值與內建預設值不同的選項。此引數預設關閉。只有超級使用者才能更改此設定。
auto_explain.log_format
(enum
) #auto_explain.log_format
選擇要使用的 EXPLAIN
輸出格式。允許的值為 text
、xml
、json
和 yaml
。預設是 text。只有超級使用者才能更改此設定。
auto_explain.log_level
(enum
) #auto_explain.log_level
選擇 auto_explain 將用於記錄查詢計劃的日誌級別。有效值為 DEBUG5
、DEBUG4
、DEBUG3
、DEBUG2
、DEBUG1
、INFO
、NOTICE
、WARNING
和 LOG
。預設值是 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'
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
Takahiro Itagaki <itagaki.takahiro@oss.ntt.co.jp>
如果您在文件中發現任何不正確的內容、與您使用該功能的實際情況不符或需要進一步說明的內容,請使用 此表單 報告文件問題。