1. 程式人生 > 其它 >KingbaseES 如何在日誌檔案記錄查詢執行計劃

KingbaseES 如何在日誌檔案記錄查詢執行計劃

KingbaseES資料庫提供了外掛auto_explain,用於在日誌中自動記錄慢速語句的執行計劃。
相比於explain與物件管理工具,auto_explain對於在大型應用程式中跟蹤未優化的查詢特別有幫助,或者發現手動explain的計劃與實際執行時計劃存在差異的情況。

根據作用範圍不同,auto_explain有以下兩種方式:

  • 作用於當前會話
    LOAD'auto_explain';(必須是超級使用者才能這樣做)

  • 作用於全域性
    在kingbase.conf中 將 ‘auto_explain’ 新增入 shared_preload_libraries引數中,可將其預載入到所有會話中。這樣做會帶來額外的效能開銷。

有一些配置引數用來控制auto_explain的行為。注意預設行為是什麼也不做,因此如果你想要任何結果就必須至少設定auto_explain.log_min_duration。

  • auto_explain.log_min_duration
    log_min_duration是導致記錄語句執行計劃的最小的執行時間(以毫秒為單位)。如果設定為0,會記錄所有的執行計劃。預設值是-1,即不記錄。比如,如果設定為300ms,即記錄執行時間超過300ms的語句的執行計劃(包含300ms)

  • auto_explain.log_analyze
    該引數控制是否加入analyze功能,即除了計劃外把實際執行時間等資訊也打出來,注意該引數開啟後會對效能產生較大影響,預設值為off

  • auto_explain.log_settings
    該引數控制是否列印已修改的配置選項的資訊,輸出中僅包含影響執行計劃的配置選項,預設值為off

  • auto_explain.log_verbose
    該引數控制是否在執行計劃中列印更為詳細的輸出資訊,預設值為off

  • auto_explain.log_buffers
    該引數控制是否在執行計劃中列印緩衝區使用的資訊,預設值為off

  • auto_explain.log_wal
    該引數控制是否列印WAL日誌的資訊,預設值為off

  • auto_explain.log_triggers
    該引數控制是否列印觸發器的統計資訊,注意只有當auto_explain.log_analyze引數開啟時,該引數才有效,預設值為off

  • auto_explain.log_format
    該引數用於控制執行計劃的輸出格式,可以是text、xml、json、yaml,預設值為text

  • auto_explain.log_level
    該引數用於控制auto_explain外掛的日誌級別,其值同伺服器的日誌級別相同,預設值為LOG

  • auto_explain.log_nested_statements
    該引數用於控制是否支援巢狀語句(在一個函式內執行的語句)的執行計劃輸出,當它關閉時,只記錄頂層語句的計劃,預設值為off

  • auto_explain.log_timing
    該引數用於控制是否列印計劃中每個節點的計時資訊,注意只有當auto_explain.log_analyze引數開啟時,該引數才有效,預設值為off

  • auto_explain.sample_rate
    該引數用於控制列印會話中語句計劃的比例,預設值為1,表示輸出所有語句的計劃

普通使用者使用load方式呼叫會報錯:
test=> LOAD'auto_explain';
錯誤:  不允許對庫 "auto_explain"進行訪問
切換為超級使用者
test=#  LOAD'auto_explain';
LOAD
test=# SET auto_explain.log_min_duration = 0;
SET
test=# SET auto_explain.log_analyze = true;  
SET
test=# 
test=# select * from sys_class where relnamespace = 2200;  

查詢日誌,可以在日誌中看到對應的執行計劃:
日誌:  duration: 0.279 ms  plan:
        Query Text: select * from sys_class where relnamespace = 2200;
        Seq Scan on pg_class  (cost=0.00..39.45 rows=1 width=264) (actual time=0.033..0.198 rows=11 loops=1)
          Filter: (relnamespace = '2200'::oid)
          Rows Removed by Filter: 761

如果想在client直接顯示,設定client_min_messages='log'就可以看到auto explain的輸出了。
test=# set client_min_messages='log';
SET
test=# select * from sys_class where relnamespace = 11;  
日誌:  duration: 1.565 ms  plan:
Query Text: select * from sys_class where relnamespace = 11;
Seq Scan on pg_class  (cost=0.00..39.45 rows=330 width=264) (actual time=0.013..0.164 rows=330 loops=1)
  Filter: (relnamespace = '11'::oid)
  Rows Removed by Filter: 442