PostgreSQL?auto_explain的具體使用
一、概述
auto_explain 插件可以實(shí)現(xiàn)在數(shù)據(jù)庫日志中自動記錄慢 SQL 執(zhí)行計(jì)劃。PostgreSQL 編譯安裝時使用了 make world & make install-world 命令,則所有內(nèi)置插件(包括 auto_explain)會默認(rèn)被安裝到數(shù)據(jù)庫中,可直接調(diào)用。在 PostgreSQL 中執(zhí)行 LOAD 'auto_explain'; 若無報(bào)錯則表明插件已存在。PostgreSQL 主流穩(wěn)定版本 9.x 及以上均已支持。
二、使用
2.1 session_preload_libraries 調(diào)用(用戶級別)
--調(diào)用
ALTER ROLE u1 SET session_preload_libraries = 'auto_explain';
ALTER ROLE u1 SET auto_explain.log_min_duration = '3s';
--u1 用戶新連入數(shù)據(jù)庫的會話,執(zhí)行超3s的sql將在數(shù)據(jù)庫日志中打印執(zhí)行計(jì)劃
2025-05-27 14:01:10.821 CST [3335] LOG: duration: 4004.207 ms plan:
Query Text: SELECT pg_sleep(4);
Result (cost=0.00..0.01 rows=1 width=4)
--取消調(diào)用
ALTER ROLE u1 set session_preload_libraries = default;
ALTER ROLE u1 set session_preload_libraries = default;
2.2 LOAD 調(diào)用(會話級別)
--調(diào)用
LOAD 'auto_explain';
set auto_explain.log_min_duration = '3s';
--當(dāng)前會話,執(zhí)行超3s的sql將在數(shù)據(jù)庫日志中打印執(zhí)行計(jì)劃
2025-05-27 14:15:03.547 CST [3581] LOG: duration: 4004.732 ms plan:
Query Text: SELECT pg_sleep(4);
Result (cost=0.00..0.01 rows=1 width=4)
--取消調(diào)用
臨時調(diào)用,退出當(dāng)前會話即可。
2.3 shared_preload_libraries 調(diào)用(全局級別)
--調(diào)用(若未配置環(huán)境變量$PGDATA替換為postgresql.conf所在實(shí)際路徑)
cat >> $PGDATA/postgresql.conf << 'eof'
shared_preload_libraries = 'auto_explain'
auto_explain.log_min_duration = '3s'
eof
psql postgres postgres -c 'checkpoint'
pg_ctl restart
--新連入數(shù)據(jù)庫的會話,執(zhí)行超3s的sql將在數(shù)據(jù)庫日志中打印執(zhí)行計(jì)劃
2025-05-27 14:25:30.559 CST [3884] LOG: duration: 5005.176 ms plan:
Query Text: SELECT pg_sleep(5);
Result (cost=0.00..0.01 rows=1 width=4)
--取消調(diào)用
sed -i '/^shared_preload_libraries = '\''auto_explain'\''/d' $PGDATA/postgresql.conf
sed -i '/^auto_explain.log_min_duration = '\''3s'\''/d' $PGDATA/postgresql.conf
psql postgres postgres -c 'checkpoint'
pg_ctl restart
三、對比
| 方式 | 生效范圍 | 是否需要重啟 | 靈活性 | 適用場景 | 主要缺點(diǎn) |
|---|---|---|---|---|---|
| shared_preload_libraries | 全局 | 是 | 低 | 長期全局監(jiān)控 | 需重啟,可能資源浪費(fèi) |
| LOAD | 當(dāng)前會話 | 否 | 高 | 臨時調(diào)試 | 手動操作,無法自動化 |
| session_preload_libraries | 新會話 | 否 | 中 | 按會話/用戶自動啟用 | 僅對新會話生效,參數(shù)限制 |
生產(chǎn)環(huán)境長期監(jiān)控:優(yōu)先使用 shared_preload_libraries,全局配置過濾條件(如 log_min_duration)減少日志量。
臨時診斷:使用 LOAD 命令,靈活且不影響其他會話。
特定用戶/應(yīng)用分析:使用 session_preload_libraries,通過連接參數(shù)或角色配置實(shí)現(xiàn)按需加載。
四、其他參數(shù)介紹
詳情參考官網(wǎng):https://www.postgresql.org/docs/current/auto-explain.html
auto_explain.log_min_duration (整數(shù)):控制執(zhí)行計(jì)劃日志記錄的最小語句執(zhí)行時間(單位:毫秒)。設(shè)為
0時記錄所有執(zhí)行計(jì)劃。默認(rèn)值-1表示禁用日志記錄。例如:設(shè)置為250時,所有執(zhí)行時間 ≥250 毫秒的語句將被記錄。僅超級用戶可修改此參數(shù)。auto_explain.log_parameter_max_length (整數(shù)):控制查詢參數(shù)值的日志記錄方式。默認(rèn)值
-1表示完整記錄參數(shù)值。0禁用參數(shù)值記錄。大于0時,將參數(shù)值截?cái)酁橹付ㄗ止?jié)數(shù)。僅超級用戶可修改此參數(shù)。auto_explain.log_analyze (布爾值):啟用后,記錄執(zhí)行計(jì)劃時輸出
EXPLAIN ANALYZE而非普通EXPLAIN結(jié)果。默認(rèn)值:off。僅超級用戶可修改此參數(shù)。auto_explain.log_buffers (布爾值):控制是否在日志中輸出緩沖區(qū)使用統(tǒng)計(jì)信息(等效于
EXPLAIN的BUFFERS選項(xiàng))。僅在auto_explain.log_analyze啟用時生效。默認(rèn)值:off。僅超級用戶可修改此參數(shù)。auto_explain.log_wal (布爾值):控制是否在日志中輸出 WAL 使用統(tǒng)計(jì)信息(等效于
EXPLAIN的WAL選項(xiàng))。僅在auto_explain.log_analyze啟用時生效。默認(rèn)值:off。僅超級用戶可修改此參數(shù)。auto_explain.log_timing (布爾值):控制是否在日志中輸出每個節(jié)點(diǎn)的定時信息(等效于
EXPLAIN的TIMING選項(xiàng))。禁用后可減少系統(tǒng)時鐘讀取開銷,適用于僅需實(shí)際行數(shù)而非精確時間的場景。僅在auto_explain.log_analyze啟用時生效。默認(rèn)值:on。僅超級用戶可修改此參數(shù)。auto_explain.log_triggers (布爾值):控制是否在日志中包含觸發(fā)器執(zhí)行統(tǒng)計(jì)信息。僅在
auto_explain.log_analyze啟用時生效。默認(rèn)值:off。僅超級用戶可修改此參數(shù)。auto_explain.log_verbose (布爾值):控制是否在日志中輸出詳細(xì)執(zhí)行計(jì)劃信息(等效于
EXPLAIN的VERBOSE選項(xiàng))。默認(rèn)值:off。僅超級用戶可修改此參數(shù)。auto_explain.log_settings (布爾值):控制是否在日志中輸出影響查詢規(guī)劃的修改后配置選項(xiàng)信息(僅顯示與內(nèi)置默認(rèn)值不同的選項(xiàng))。默認(rèn)值:
off。僅超級用戶可修改此參數(shù)。auto_explain.log_format (枚舉):指定
EXPLAIN輸出格式。可選值為text、xml、json和yaml,默認(rèn)為text。僅超級用戶可修改此參數(shù)。auto_explain.log_level (枚舉):設(shè)置自動解釋查詢計(jì)劃的日志級別。有效值為
DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、INFO、NOTICE、WARNING和LOG,默認(rèn)為LOG。僅超級用戶可修改此參數(shù)。auto_explain.log_nested_statements (布爾值):控制是否記錄嵌套語句(函數(shù)內(nèi)部執(zhí)行的語句)。設(shè)為
off時僅記錄頂層查詢計(jì)劃。默認(rèn)值:off。僅超級用戶可修改此參數(shù)。auto_explain.sample_rate (實(shí)數(shù)):設(shè)置每個會話中僅解釋部分語句的比例。默認(rèn)值
1表示解釋所有查詢。嵌套語句要么全解釋,要么全不解釋。僅超級用戶可修改此參數(shù)。
到此這篇關(guān)于PostgreSQL auto_explain的文章就介紹到這了,更多相關(guān)PostgreSQL auto_explain內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PostgreSQL教程(四):數(shù)據(jù)類型詳解
這篇文章主要介紹了PostgreSQL教程(四):數(shù)據(jù)類型詳解,本文講解了數(shù)值類型、字符類型、布爾類型、位串類型、數(shù)組、復(fù)合類型等數(shù)據(jù)類型,需要的朋友可以參考下2015-05-05
PostgreSQL 分頁查詢時間的2種比較方法小結(jié)
這篇文章主要介紹了PostgreSQL 分頁查詢時間的2種比較方法小結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
postgresql查詢自動將大寫的名稱轉(zhuǎn)換為小寫的案例
這篇文章主要介紹了postgresql查詢自動將大寫的名稱轉(zhuǎn)換為小寫的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
PostgreSQL?數(shù)據(jù)誤刪止損操作指南
本文主要介紹了PostgreSQL數(shù)據(jù)誤刪恢復(fù)的技術(shù)指南,詳細(xì)闡述了誤刪恢復(fù)的核心原理、緊急止損的黃金三步、三種恢復(fù)方案(使用pg_dirtyread插件、底層十六進(jìn)制解析、基于WAL日志的時間點(diǎn)恢復(fù)),并提供了相應(yīng)的操作步驟和注意事項(xiàng),感興趣的朋友一起看看吧2026-04-04
PostgreSQL實(shí)現(xiàn)定期備份的方法
PostgreSQL定期備份功能可以自動備份數(shù)據(jù)庫,避免了手動備份過程中可能發(fā)生的錯誤,也極大地減輕了管理員的工作壓力,所以本文將給大家介紹一下PostgreSQL實(shí)現(xiàn)定期備份的方法,需要的朋友可以參考下2024-03-03

