系統中有些SQL語句運行了很長時間還沒有結束,這些語句會消耗很多的系統性能,請根據本章內容查詢長時間運行的SQL語句。
操作步驟
步驟 1 使用DAS或者gsql連接實例。
步驟 2 查詢系統中長時間運行的查詢語句。
SELECT current_timestamp - query_start AS runtime, datname, usename, query FROM pg_stat_activity where state != 'idle' ORDER BY 1 desc;
查詢后會按執行時間從長到短順序返回查詢語句列表,第一條結果就是當前系統中執行時間最長的查詢語句。返回結果中包含了系統調用的SQL語句和用戶執行SQL語句,請根據實際找到用戶執行時間長的語句。
若當前系統較為繁忙,可以通過限制current_timestamp - query_start大于某一閾值來查看執行時間超過此閾值的查詢語句。
SELECT query FROM pg_stat_activity WHERE current_timestamp - query_start > interval '1 days';
步驟 3 設置參數track_activities為on。
SET track_activities = on;
當此參數為on時,數據庫系統才會收集當前活動查詢的運行信息。
步驟 4 查看正在運行的查詢語句。
以查看視圖pg_stat_activity為例:
SELECT datname, usename, state FROM pg_stat_activity;?
?datname? | usename | state? |?
----------+---------+--------+?
?postgres |?? omm?? | idle?? |?
?postgres |?? omm?? | active |?
(2 rows)
如果state字段顯示為idle,則表明此連接處于空閑,等待用戶輸入命令。
如果僅需要查看非空閑的查詢語句,則使用如下命令查看:
SELECT datname, usename, state FROM pg_stat_activity WHERE state != 'idle';
步驟 5 分析長時間運行的查詢語句狀態。
- 若查詢語句處于正常狀態,則等待其執行完畢。
- 若查詢語句阻塞,則通過如下命令查看當前處于阻塞狀態的查詢語句:
SELECT datname, usename, state, query FROM pg_stat_activity WHERE waiting = true;
查詢結果中包含了當前被阻塞的查詢語句,該查詢語句所請求的鎖資源可能被其他會話持有,正在等待持有會話釋放鎖資源。
只有當查詢阻塞在系統內部鎖資源時,waiting字段才顯示為true。盡管等待鎖資源是數據庫系統最常見的阻塞行為,但是在某些場景下查詢也會阻塞在等待其他系統資源上,例如寫文件、定時器等。但是這種情況的查詢阻塞,不會在視圖pg_stat_activity中體現。