全部產品
Search
文件中心

PolarDB:SQL效能分析

更新時間:Nov 27, 2024

執行SQL語句時,如果出現慢SQL或SQL佔用系統記憶體的情況,需進行具體查詢分析。

查詢慢SQL

查詢慢SQL語句分為以下兩種情況:

  • 查看歷史慢SQL語句:

    通過觀察pg_stat_statements視圖,執行時間較長的SQL語句。

    SELECT total_exec_time / calls AS avg, query 
    FROM pg_stat_statements ORDER BY avg DESC LIMIT 10;
  • 查看當前慢SQL語句。

    查詢執行時間超過1秒的SQL:

    SELECT * FROM pg_stat_activity WHERE state<>'idle' AND now()-query_start > interval '1 s' ORDER BY query_start;

使用EXPLAIN查詢SQL計劃

通過使用EXPLAIN查詢SQL計劃,可分析SQL的快慢或資源佔用情況。

使用EXPLAIN執行以下語句,可獲得SQL的查詢計劃。具體文法樣本如下:

EXPLAIN [ ( option [, ...] ) ] statement
EXPLAIN [ ANALYZE ] [ VERBOSE ] statement

where option can be one of:

    ANALYZE [ boolean ]
    VERBOSE [ boolean ]
    COSTS [ boolean ]
    BUFFERS [ boolean ]
    FORMAT { TEXT | XML | JSON | YAML }

上述樣本對應的命令參數選項含義如下:

參數

說明

ANALYZE

會實際執行SQL,並獲得相應的查詢計劃,預設為FALSE。如果最佳化一些修改資料的SQL需要真實的執行但又不能影響現有的資料,可以放在一個事務中,分析完成後可以直接復原。

VERBOSE

會顯示查詢計劃的附加資訊,預設為FALSE。附加資訊包括查詢計劃中每個節點輸出的列(Output),表的SCHEMA資訊,函數的SCHEMA 資訊,運算式中列所屬表的別名,以及被觸發的觸發器名稱等。

COSTS

會顯示每個計劃節點的預估啟動代價(找到第一個合格結果的代價)和總代價,以及預估行數和每行寬度,預設為TRUE。

BUFFERS

會顯示關於緩衝的使用資訊,預設為FALSE。該參數只能與ANALYZE 參數一起使用。緩衝區資訊包括共用塊(常規表或者索引塊)、本地塊(暫存資料表或者索引塊)和臨時塊(排序或者雜湊等涉及到的短期存在的資料區塊)的命中塊數,更新塊數,擠出塊數。

FORMAT

指定輸出格式,預設為TEXT。各個格式輸出的內容都是相同的,其中XML | JSON | YAML更有利於您通過程式解析SQL語句的查詢計劃。

視圖分析

可以通過觀察視圖pg_stat_statementspolar_stat_sql進行分析SQL執行需佔用的資源情況,這兩個視圖需建立相關外掛程式,並開啟開關。

說明

安裝polar_stat_sql外掛程式以及開啟開關需要使用超級使用者操作,請聯絡我們處理。

CREATE EXTENSION pg_stat_statements;
CREATE EXTENSION polar_stat_sql;

ALTER SYSTEM SET polar_stat_sql.enable_stat=on;

ALTER SYSTEM SET polar_stat_sql.enable_qps_monitor=on;

SELECT pg_reload_conf();
 pg_reload_conf 
----------------
 t
(1 row)
  • pg_stat_statements視圖說明請參見pg_stat_statements

  • polar_stat_sql視圖說明。

    sql層級監控視圖資訊包含4個部分內容:

    • 執行計畫節點統計資訊(掃描計劃節點、join計劃節點、聚集計劃節點、排序計劃節點、hash計劃節點)。

    • 收集SQL層級的CPU已耗用時間(分為系統態和使用者態)、IO(讀寫位元組數)、memory(請求頁數,交換頁數)、ipc(ipc message接受量和請求量)、CPU環境切換(分為自願切換和非自願)。

    • SQL的各個執行階段耗時統計,包括parse時間、analyze時間、rewrite時間、執行計畫產生時間、執行時間。

    • latch和鎖資訊統計。

    polar_stat_sql視圖用於記錄累計資料,在執行SQL之前需進行清空。

    SELECT polar_stat_sql_reset();