執行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_statements和polar_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();