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
選項。重複讀取系統時脈的開銷可能會顯著降低某些系統上查詢的速度,因此,當只需要實際的列計數,而不需要精確的時間時,將此參數設定為 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
控制在記錄執行計畫時是否印出詳細資訊;它等同於 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 僅解釋每個會期(session)中一部分語句。 預設值為 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 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
Takahiro Itagaki <itagaki.takahiro@oss.ntt.co.jp>
如果您在文件看到任何不正確、與您特定功能的使用經驗不符或需要進一步說明的內容,請使用此表單回報文件問題。