本文分享自華爲雲社區《GaussDB(DWS)運維利刃:TopSQL工具解析》,作者:胡辣湯。
在生產環境中,難免會面臨查詢語句出現異常中斷、阻塞時間長等突發問題,如果沒能及時記錄信息,事後就需要投入更多的人力及時間成本進行問題的定位和解決,有時還無法定位到錯誤出現的地方。在本期《GaussDB(DWS)運維利刃:TopSQL工具解析》的主題直播中,華爲雲數倉GaussDB(DWS)調優專家劉坤鵬老師,深入講解GaussDB(DWS) TopSQL的基本原理、能力及典型應用場景。
一、 什麼是TopSQL?
TopSQL是GaussDB(DWS)數據庫中內置的一款功能十分強大的性能分析工具。在生產環境中,難免會出現一些突發情況,導致查詢語句出現異常中斷、阻塞時間長等情況,如果當時沒能記錄下來,那麼事後就要投入更多的人力以及時間成本去對錯誤進行定位和解決,有時還往往定位不到錯誤出現的地方。爲了解決這樣的窘迫的情況,GaussDB(DWS)開發了TopSQL功能,對運行中的語句記錄(實時TopSQL),對運行完成的語句進行記錄(歷史TopSQL)。
TopSQL作爲GaussDB(DWS)的性能診斷工具,記錄GaussDB(DWS)中各個作業、算子級別的資源使用數據、耗時數據,包括下盤信息、內存、網絡、耗時、自診斷告警、基礎信息等作業執行的數據。
TopSQL工作原理
二、TopSQL系統表和參數介紹
以GaussDB(DWS) 8.1.3版本爲例,推薦TopSQL相關的一些參數。
參數 |
解釋及用法 |
enable_resource_track:on |
資源監控總開關,開啓後TopSQL才能發揮作用。 |
enable_resource_record:on |
控制實時TopSQL是否做歷史TopSQL轉儲,813版本推薦打開,方便對歷史問題做定位分析。 |
resource_track_cost:0 |
執行代價超過預值,纔會被記錄,建議保持默認值0。 |
resource_track_duration:1 |
實時TopSQL是否轉儲到歷史TopSQL,默認值爲60秒,建議設置爲1。 |
resource_track_level:query/perf |
語句級TopSQL信息記錄到歷史TopSQL的系統表中。 |
TopSQL_retention_time:30 |
TopSQL老化時間爲30秒,建議保持默認值。 |
enable_track_record_subsql:按需開啓 |
控制子查詢是否記錄到TopSQL系統表中。 |
TopSQL常用系統表:
• 實時TopSQL:pgxc_wlm_session_statistics
• 歷史TopSQL:pgxc_wlm_session_info
TopSQL系統表關鍵字段:
字段 |
字段說明 |
username |
用戶名 |
block_time |
排隊時間,輔助定位CCN場景 |
Start_time |
語句執行的開始時間 |
duration |
語句執行時長,重點關注 |
Estimate_memory |
估算內存,複製定位ccn排隊或內存問題 |
Max_peak_memory |
實際最大使用內存,定位內存不足場景 |
Max_spill_size |
下盤大小 |
Unique_sql_id |
歸一化ID,標誌同一語句/同一語句不同入參 |
Cpu_skew_percent |
CPU傾斜情況 |
warning |
自診斷信息 |
三、TopSQL的3個典型應用場景
1、 實時TopSQL
問題場景:某集羣業務反饋某業務SQL偶發執行慢,該集羣resource_track_duration設置較大,歷史TopSQL中沒有記錄計劃詳情,需要定位原因。
處理過程:
1) 系統管理員根據queryid查看等待視圖,等待視圖部分結果如下:
2)管理員執行explain verbose,得到的執行計劃如下
3) 第8層非Stream算子,說明該計劃不是正在執行語句的計劃,使用實時TopSQL查看實際計劃:
2、 歷史TopSQL
問題場景:某客戶由於內存規格較小,經常出現內存不可用的報錯,雲上運維人員通過autopilot定期巡檢時發現該集羣內存週期性衝高,且存在單實例內存使用傾斜的問題,需定位原因。
處理過程:
1) 通過歷史TopSQL找到內存佔用高的語句
Select * from pgxc_wlm_session_info where start_time > '2023-10-30 10:05' and start_time < '2023-10-30 10:10' order by max_peak_memory desc limit 100;
2) 根據unique_sql_id確認作業的歷史執行情況
3、 存儲過程子語句
問題場景:某客戶在業務中封裝了大量的存儲過程和匿名塊腳本,用於業務系統的調度,隨着業務數據越來越多,存儲過程和匿名塊腳本執行越來越慢,需要對其中的腳本進行優化。示例腳本如下:
處理過程:
1) 查看歷史TopSQL,存儲過程和匿名塊的query_plan字段顯示NoPlan;
2) 設置enable_track_record_subsql: on,該參數打開後可以記錄存儲過程和匿名塊中的自語句和執行計劃;
3) 重新執行慢的存儲過程,根據query_id查看歷史TopSQL中各個自語句的執行計劃。
四、如何通過TopSQL進行信息統計
1、 常用TopSQL進行業務信息統計
1) 識別stream數量多的語句:select *,(length(query_plan) - length(replace(query_plan, 'Streaming', ''))) / length('Streaming') as stream_count FROM pgxc_wlm_session_info ORDER BY stream_count DESC limit 100;
2) 識別內存佔用高的語句:select * from pgxc_wlm_session_info where start_time > 'xxxx-xx-xx' and start_time < 'xxxx-xx-xx' order by max_peak_memory desc limit 100;
3) 識別需要優化的語句:select * from pgxc_wlm_session_info where start_time > 'xxxx-xx-xx' and start_time < 'xxxx-xx-xx' and warning is not null order by duration desc limit 100。
2、 TopSQL使用注意事項
1) 查詢時使用start_time做條件,避免全表查詢;
2) 查詢時使用limit對結果集大小限制,防止結果集過大導致客戶端OOM。
本期分享到此結束,更多關於GaussDB(DWS)產品技術解析、數倉產品新特性的介紹,請關注GaussDB(DWS)開發者平臺,GaussDB(DWS)開發者平臺爲開發者們提供最新、最全的信息諮詢,包括精品技術文章、最佳實踐、直播集錦、熱門活動、海量案例、智能機器人。讓您學+練+玩一站式體驗GaussDB(DWS)。
GaussDB(DWS)開發者平臺鏈接:https://bbs.huaweicloud.com/contents/dws/learning.html