華為云計算 云知識 【云小課】如何初步定位GaussDB(for openGauss)慢SQL
【云小課】如何初步定位GaussDB(for openGauss)慢SQL

云小課必用.png

數(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ù)終止本會話后臺線程時,客戶端不會退出而是自動重連。