GaussDB(DWS)語句一直跑不出來怎么辦
背景:使用數(shù)據(jù)庫過程中,執(zhí)行一條查詢語句很慢,想知道后臺語句的執(zhí)行情況。可通過以下方式查看數(shù)據(jù)庫后臺當(dāng)前執(zhí)行的所有語句和語句的執(zhí)行情況。
1. PGXC_STAT_ACTIVITY視圖介紹
PGXC_STAT_ACTIVITY簡稱活躍視圖,該視圖顯示當(dāng)前集群下所有CN的查詢相關(guān)的信息,只有系統(tǒng)管理員才有權(quán)限執(zhí)行。該視圖的coorname表示執(zhí)行該語句的CN,query_id字段表示該query的唯一ID,同一條語句在不同節(jié)點的query_id相同,不同語句的query_id不同。pid表示該語句在對應(yīng)節(jié)點上的線程ID,usename表示執(zhí)行該語句的用戶,query_start表示該語句開始執(zhí)行的時間,enqueue表示語句是否正在排隊。該字段為空表示未處于排隊狀態(tài),state字段表示對應(yīng)的語句執(zhí)行狀態(tài),常見狀態(tài)如下:
active:后端正在執(zhí)行一個查詢。
idle:后端正在等待一個新的客戶端命令。
idle in transaction:后端在事務(wù)中,但事務(wù)中沒有語句在執(zhí)行。
idle in transaction (aborted):后端在事務(wù)中,但事務(wù)中有語句執(zhí)行失敗。
利用此視圖對相關(guān)字段進(jìn)行過濾,即可查詢得到當(dāng)前的后臺所有CN上的活躍語句:
select coorname, usename, client_addr, sysdate-query_start as dur, enqueue, query_id, substr(query,1,60) from pgxc_stat_activity where usename != 'Ruby' and state != 'idle' order by dur desc;
其中,Ruby用戶為數(shù)據(jù)庫的初始用戶,一般情況下我們不關(guān)心初始用戶相關(guān)的語句。執(zhí)行上述查詢即可得到當(dāng)前后臺所有活躍的sql情況和已經(jīng)執(zhí)行的時長。接下來,可以根據(jù)查到的query_id利用等待視圖PGXC_THREAD_WAIT_STATUS對執(zhí)行的慢sql進(jìn)行分析,查看語句的執(zhí)行狀態(tài)。
2. PGXC_THREAD_WAIT_STATUS視圖介紹
PGXC_THREAD_WAIT_STATUS簡稱等待視圖,通過CN節(jié)點查看PGXC_THREAD_WAIT_STATUS視圖,可以查看集群全局各個節(jié)點上所有SQL語句產(chǎn)生的線程之間的調(diào)用層次關(guān)系,以及各個線程的阻塞等待狀態(tài),從而更容易定位進(jìn)程停止響應(yīng)問題以及類似現(xiàn)象的原因。該視圖中我們需重點關(guān)注wait_status字段和wait_event字段,其中,wait_status字段表示當(dāng)前線程的等待狀態(tài),wait_event表示等待事件,一般為acquire lock、acquire lwlock、wait io三種類型。根據(jù)上一步查詢得到的query_id查詢等待視圖,即可得到該語句的等待時間狀態(tài),分析出慢sql的瓶頸點:
select * from pgxc_thread_wait_status where query_id = 20971544;
例如:
select * from pgxc_thread_wait_status where query_id=20971544; node_name | db_name | thread_name | query_id | tid | lwtid | ptid | tlevel | smpid | wait_status | wait_event --------------+----------+--------------+----------+-----------------+-------+-------+--------+-------+---------------------- datanode1 | postgres | coordinator1 | 20971544 | 139902867994384 | 22735 | | 0 | 0 | wait node: datanode3 | datanode1 | postgres | coordinator1 | 20971544 | 139902838634256 | 22970 | 22735 | 5 | 0 | synchronize quit | datanode1 | postgres | coordinator1 | 20971544 | 139902607947536 | 22972 | 22735 | 5 | 1 | synchronize quit | datanode2 | postgres | coordinator1 | 20971544 | 140632156796688 | 22736 | | 0 | 0 | wait node: datanode3 | datanode2 | postgres | coordinator1 | 20971544 | 140632030967568 | 22974 | 22736 | 5 | 0 | synchronize quit | datanode2 | postgres | coordinator1 | 20971544 | 140632081299216 | 22975 | 22736 | 5 | 1 | synchronize quit | datanode3 | postgres | coordinator1 | 20971544 | 140323627988752 | 22737 | | 0 | 0 | wait node: datanode3 | datanode3 | postgres | coordinator1 | 20971544 | 140323523131152 | 22976 | 22737 | 5 | 0 | net flush data | datanode3 | postgres | coordinator1 | 20971544 | 140323548296976 | 22978 | 22737 | 5 | 1 | net flush data datanode4 | postgres | coordinator1 | 20971544 | 140103024375568 | 22738 | | 0 | 0 | wait node: datanode3 datanode4 | postgres | coordinator1 | 20971544 | 140102919517968 | 22979 | 22738 | 5 | 0 | synchronize quit | datanode4 | postgres | coordinator1 | 20971544 | 140102969849616 | 22980 | 22738 | 5 | 1 | synchronize quit | coordinator1 | postgres | gsql | 20971544 | 140274089064208 | 22579 | | 0 | 0 | wait node: datanode4 | (13 rows)
可以看到,該語句在CN1執(zhí)行,coordinator1在等datanode4,datanode4在等datanode3,datanode3在的等待狀態(tài)為net flush data,表示該節(jié)點正在向網(wǎng)絡(luò)中發(fā)送數(shù)據(jù),說明整個查詢的瓶頸點在datanode3的網(wǎng)絡(luò)傳輸,該節(jié)點可能存在網(wǎng)絡(luò)瓶頸。
等待視圖中各等待狀態(tài)詳情可以通過以下文檔查看:
https://support.huaweicloud.com/devg-dws/dws_04_0565.html
3. 使用示例
(1) 執(zhí)行alter語句卡住,查看活躍視圖,找到query_id
select * from pgxc_stat_activity where state = 'active' and usename <> 'omm' and usename <> 'Ruby' order by query_start;
(2) 找到根據(jù)1中找到的query_id查詢等待視圖:
postgres=# select * from pgxc_thread_wait_status where query_id = 73464968921976133; node_name | db_name | thread_name | query_id | tid | lwtid | ptid | tlevel | smpid | wait_status | wait_event --------------+----------+-------------+-------------------+-----------------+-------+------+--------+-------+--------------+------------ coordinator1 | postgres | gsql | 73464968921976133 | 139766273128192 | 55767 | | 0 | 0 | acquire lock | relation (1 row)
(3) 根據(jù)等待視圖結(jié)果確認(rèn)語句執(zhí)行狀態(tài)
本例中語句在等鎖,可參考鎖等待案例解決:https://bbs.huaweicloud.com/blogs/233114
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。