透過Azure DataStudio / SSMS查詢效能不佳的SQL語法
這兩天遇到一個情境,一個早上突然所有的請求都卡住,平均回應 時間都要1~2分鐘。當下一時間沒啥方向,往登入那邊查,結果找錯了方向,會這樣想純粹是因為認為那個是一條測試的必經之路。而我們還在開發的資料庫中,最多也才幾百筆,最大 也不到一萬筆,為什麼會突然 這麼慢呢?
後來請 DBA看了一下後,馬上就找到問題了,大至記錄如下:
情境:
假如現在有兩張表
分別為
表 1 Master(Id)
表 2 Detail(Id, MasterId)
當時Master表大概有9xx筆,而Detail表有7千筆左右
select * from Master m
left join Detail d on m.Id = d.MasterId
where m.xxxxxx = xxxxxx
結果這樣不得了,一查發現大概執行個5、6百次 ,總執行時間就超過4小時以上了..
一般來說,PrimaryKey需設是Unique+Index(Cluster)因此只以Id作搜尋條件,效能不會差
但此時,Foreign Key若子表的Column沒有建Index,則對搜尋效能仍無影響,FK只作為 限制功能
補充以上觀點後
再補上SqlServer這次如何查找有問題的效能語法的方法(我是Mac,突然很羨慕ssms完整版功能)
不過我也立馬補上Azure Data Studio的方法,不無小補 一下。
1.Azure Portal對有問題的database進行 “查詢效能深入解析” (Azure Portal上的DB查詢權限要開放)
ex: 透過下列清單,可以查詢到Top5慢的查詢,透過查詢ID,可以再往 展開
註 : 這個畫面出不來的話代表 Azure Portal上對DB的權限不夠,不過至少可以對到查詢 ID,再請DBA或用 SSMS/Azure Data Studio去細追
2.透過SSMS,需要DBA針對db user進行開放
Query Store(查詢存放區)
-> Top Resource Consuming
-> Tracked Queries
-> QueryId
SSMS功能就是強大 ,可以針對 時間/CPU/IO統計
對於我們的查詢 ,在一個時間區間內,Where 條件不一樣 ,可能就QueryId就會不同(Plan Id就會不一樣)
-> ViewQueryTest查詢其問題語法分析 執行計劃
透過 查詢計劃可以看到發生了兩次Scan
3.透過Azure Data Studio,加入dashboard圖表
最後一種,若你是用Mac的環境(M1 Core),沒有辦法安裝SSMS這套工具的話
教學:https://learn.microsoft.com/en-us/azure-data-studio/tutorial-qds-sql-server
設定完重啟,在Database-> Manage就可以看到以下的圖表,也可以對齊上述方法的查詢Id
能看到非常 明顯 的峰點,那就還算是好的情境~(特別是還在 測試區)
針對該圖表 可以往下 看Insight的清單,可以對到1525就是問題查詢的所在
從query_sql_text就可以拿到問題語法,一樣貼到Azure Data Studio的Query窗
就可以Estimated Plan來顯示查詢計劃囉