PostgreSQL auto_explain模塊

auto_explain模塊提供了一種自動記錄慢語句執行計劃的方法,而不必手動運行EXPLAIN。這對於在大型應用程序中跟蹤未優化的查詢特別有幫助。

該模塊不提供sql可訪問的函數。要使用它,只需將它加載到服務器。你可以將它加載到一個單獨的會話中:

load 'auto_explain'

  

如果想在全局開啓該功能,可以在配置文件postgres.conf文件中通過session_preload_libraries或shared_preload_libraries進行配置。不過會有一定開銷產生。

比如:

# postgresql.conf
session_preload_libraries = 'auto_explain'
auto_explain.log_min_duration = '2s'

  

auto_explain相關參數

auto_explain.log_min_duration

log_min_duration是導致記錄語句執行計劃的最小的執行時間(以毫秒爲單位)。如果設置爲0,會記錄所有的執行計劃。默認值是-1,即不記錄。比如,如果設置爲250ms,即記錄運行時間超過250ms的語句的執行計劃(包含250ms)

auto_explain.log_analyze

布爾類型的值。如果設置爲true,在記錄的執行計劃的時候,輸出的內容是explain analyze的結果,而不是explain的結果。默認值是off。開啓後對性會有影響,

auto_explain.log_buffers

布爾類型的值。控制是否統計在執行計劃中,對buffer的使用統計信息。等價於explain buffers。默認是off的。該選項只有在開啓了auto_explain.log_analyze後纔有效。

auto_explain.log_timing

布爾類型的值。控制執行計劃中是否統計每個節點的時間信息。等價於explain timing。在有些系統中,重複地讀取系統鎖信息會降低查詢性能。一般不建議開啓。要想生效,必須先開啓auto_explain.log_analyze。默認設置是on。

auto_explain.log_triggers

布爾類型的值。在記錄執行計劃時包含觸發器執行統計信息。這個參數沒有作用,除非auto_explain.log_analyze被啓用。該參數默認關閉。只有超級用戶才能更改此設置。

auto_explain.log_verbose

布爾類型的值。控制在記錄執行計劃時是否打印詳細信息;它相當於冗長的EXPLAIN VERBOSE選項。該參數默認關閉。只有超級用戶才能更改此設置。

auto_explain.log_format

枚舉類型。定義explain的輸出格式。支持的格式有:text、xml、json、yaml。默認是text。

auto_explain.log_nested_statements

布爾類型的值。考慮對嵌套語句(在函數中執行的語句)進行日誌記錄。當它關閉時,只記錄頂級查詢計劃。該參數默認關閉。只有超級用戶才能更改此設置。

auto_explain.sample_rate

real類型的值。只解釋每個會話中的一小部分語句。默認值是1,表示解釋所有查詢。在嵌套語句的情況下,要麼全部解釋,要麼全部不解釋。只有超級用戶才能更改此設置。

使用示例

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

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章