
數(shù)據(jù)庫 在日常使用的過程中會產(chǎn)生很多SQL語句,而如果有些SQL語句運行了很長時間還沒有結束,這些語句會消耗很多的系統(tǒng)性能。
那么如何查詢到有哪些SQL語句影響了系統(tǒng)的運行呢?
學了本節(jié)課程后,您就將會掌握初步定位GaussDB(for openGauss)慢SQL的方法。
操作場景
- 數(shù)據(jù)庫執(zhí)行SQL語句長時間無響應。
- 數(shù)據(jù)庫CPU/內(nèi)存壓力一直很大。
操作步驟
1. 使用DAS或者gsql連接實例。
2. 查詢系統(tǒng)中長時間運行的查詢語句。
SELECT current_timestamp - query_start AS runtime, datname, usename, query FROM pg_stat_activity where state != 'idle' ORDER BY 1 desc;
查詢后會按執(zhí)行時間從長到短順序返回查詢語句列表,第一條結果就是當前系統(tǒng)中執(zhí)行時間最長的查詢語句。返回結果中包含了系統(tǒng)調(diào)用的SQL語句和用戶執(zhí)行SQL語句,請根據(jù)實際找到用戶執(zhí)行時間長的語句。
若當前系統(tǒng)較為繁忙,可以通過限制current_timestamp - query_start大于某一閾值來查看執(zhí)行時間超過此閾值的查詢語句。
SELECT query FROM pg_stat_activity WHERE current_timestamp - query_start > interval '1 days';
3. 設置參數(shù)track_activities為on。
SET track_activities = on;
當此參數(shù)為on時,數(shù)據(jù)庫系統(tǒng)才會收集當前活動查詢的運行信息。
4. 從當前活動會話視圖查找問題會話的線程ID。
SELECT datid, pid, state, query FROM pg_stat_activity;
顯示類似如下信息,其中pid的值即為該會話的線程ID。
datid | pid | state | query
-------+-----------------+--------+-------
13205 | 139834762094352 | active |
13205 | 139834759993104 | idle |
(2 rows)
如果state字段顯示為idle,則表明此連接處于空閑,等待用戶輸入命令。
如果僅需要查看非空閑的查詢語句,則使用如下命令查看:
SELECT datid, pid, state, query FROM pg_stat_activity WHERE state != 'idle';
5. 分析長時間運行的查詢語句狀態(tài)。
- 若查詢語句處于正常狀態(tài),則等待其執(zhí)行完畢。
如果是因為SQL執(zhí)行效率低,建議參考優(yōu)化SQL語句。
- 若查詢語句不正常執(zhí)行,則參考步驟6結束異常會話。
6. 根據(jù)線程ID結束會話。
SELECT pg_terminate_backend(139834762094352);
顯示類似如下信息,表示結束會話成功。
pg_terminate_backend
----------------------
t
(1 row)
顯示類似如下信息,表示用戶正在嘗試結束當前會話,此時僅會重連會話,而不是結束會話。
FATAL: terminating connection due to administrator command
FATAL: terminating connection due to administrator command
The connection to the server was lost. Attempting reset: Succeeded.
說明:gsql客戶端使用pg_terminate_backend函數(shù)終止本會話后臺線程時,客戶端不會退出而是自動重連。