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

云小課必用.png

數(shù)據(jù)庫(kù) 在日常使用的過(guò)程中會(huì)產(chǎn)生很多SQL語(yǔ)句,而如果有些SQL語(yǔ)句運(yùn)行了很長(zhǎng)時(shí)間還沒(méi)有結(jié)束,這些語(yǔ)句會(huì)消耗很多的系統(tǒng)性能。

那么如何查詢到有哪些SQL語(yǔ)句影響了系統(tǒng)的運(yùn)行呢?

學(xué)了本節(jié)課程后,您就將會(huì)掌握初步定位GaussDB(for openGauss)慢SQL的方法。

操作場(chǎng)景

  • 數(shù)據(jù)庫(kù)執(zhí)行SQL語(yǔ)句長(zhǎng)時(shí)間無(wú)響應(yīng)。
  • 數(shù)據(jù)庫(kù)CPU/內(nèi)存壓力一直很大。

操作步驟

1.   使用DAS或者gsql連接實(shí)例。

2.   查詢系統(tǒng)中長(zhǎng)時(shí)間運(yùn)行的查詢語(yǔ)句。

SELECT current_timestamp - query_start AS runtime, datname, usename, query FROM pg_stat_activity where state != 'idle' ORDER BY 1 desc;

查詢后會(huì)按執(zhí)行時(shí)間從長(zhǎng)到短順序返回查詢語(yǔ)句列表,第一條結(jié)果就是當(dāng)前系統(tǒng)中執(zhí)行時(shí)間最長(zhǎng)的查詢語(yǔ)句。返回結(jié)果中包含了系統(tǒng)調(diào)用的SQL語(yǔ)句和用戶執(zhí)行SQL語(yǔ)句,請(qǐng)根據(jù)實(shí)際找到用戶執(zhí)行時(shí)間長(zhǎng)的語(yǔ)句。

若當(dāng)前系統(tǒng)較為繁忙,可以通過(guò)限制current_timestamp - query_start大于某一閾值來(lái)查看執(zhí)行時(shí)間超過(guò)此閾值的查詢語(yǔ)句。

SELECT query FROM pg_stat_activity WHERE current_timestamp - query_start > interval '1 days';

3.   設(shè)置參數(shù)track_activities為on。

SET track_activities = on;

當(dāng)此參數(shù)為on時(shí),數(shù)據(jù)庫(kù)系統(tǒng)才會(huì)收集當(dāng)前活動(dòng)查詢的運(yùn)行信息。

4.   從當(dāng)前活動(dòng)會(huì)話視圖查找問(wèn)題會(huì)話的線程ID。

SELECT datid, pid, state, query FROM pg_stat_activity;

顯示類似如下信息,其中pid的值即為該會(huì)話的線程ID。

 datid |       pid       | state  | query 
-------+-----------------+--------+------- 
 13205 | 139834762094352 | active | 
 13205 | 139834759993104 | idle   | 
(2 rows)

如果state字段顯示為idle,則表明此連接處于空閑,等待用戶輸入命令。

如果僅需要查看非空閑的查詢語(yǔ)句,則使用如下命令查看:

SELECT datid, pid, state, query FROM pg_stat_activity WHERE state != 'idle';

5.   分析長(zhǎng)時(shí)間運(yùn)行的查詢語(yǔ)句狀態(tài)。

  • 若查詢語(yǔ)句處于正常狀態(tài),則等待其執(zhí)行完畢。

         如果是因?yàn)镾QL執(zhí)行效率低,建議參考優(yōu)化SQL語(yǔ)句。

  • 若查詢語(yǔ)句不正常執(zhí)行,則參考步驟6結(jié)束異常會(huì)話。

6.   根據(jù)線程ID結(jié)束會(huì)話。

SELECT pg_terminate_backend(139834762094352);

顯示類似如下信息,表示結(jié)束會(huì)話成功。

pg_terminate_backend 
---------------------- 
 t 
(1 row)

顯示類似如下信息,表示用戶正在嘗試結(jié)束當(dāng)前會(huì)話,此時(shí)僅會(huì)重連會(huì)話,而不是結(jié)束會(huì)話。

FATAL:  terminating connection due to administrator command 
FATAL:  terminating connection due to administrator command 
The connection to the server was lost. Attempting reset: Succeeded.

說(shuō)明:gsql客戶端使用pg_terminate_backend函數(shù)終止本會(huì)話后臺(tái)線程時(shí),客戶端不會(huì)退出而是自動(dòng)重連。