Azure SQL 數據庫過快達到 CPU 限制
簡而言之背景: - 我們的 SAAS 解決方案包含以下主要組件。1. 我們有一個門戶網站後端,管理員可以在其中編輯數據。2. 我們有一個由移動設備呼叫的 Web API。移動設備跟踪或報告學生的閱讀進度
到目前為止,該解決方案託管在虛擬伺服器上。現在我們正在將解決方案遷移到 Azure 框架,以便我們可以利用彈性數據庫池的可伸縮性。當文章可以非同步處理時,我們使用事件主題來處理來自移動設備的大量文章,但是有些文章需要同步處理,我們發現 Azure 的結構在處理多個並發連接時真的很慢.
問題的一個範例:- 因此,當 Azure 執行如下查詢時:-
SELECT q.Category, COUNT(*) FROM Question q JOIN Answer a ON a.QuestionId = q.QuestionId GROUP BY q.Category ORDER BY q.Category
SQL CPU 在以下所有場景中都達到 97% 以上的峰值: - 1. DTU 為 50,並且有多個並發呼叫。2. DTU 為 1500 且有 5 個或更多並發呼叫。3. DTU 為 4000 且有 20 個或更多並發呼叫。
所以我們打開了與微軟的支持電話。我們花了一個多星期的時間來調查從 sql 統計數據和索引到 web api 定價層的事情。畢竟,在上述場景中,我們仍然找到了 SQL 數據庫中 CPU 達到峰值的證據。
這導致了不可避免的“重寫系統的大塊”之類的論點。
因此,根本問題是彈性數據庫池的性能似乎無法達到標準 SQL 數據庫的能力。此外,獨立數據庫的性能似乎無法與虛擬伺服器的性能競爭。
這太令人沮喪了,因為我們向我們推薦了彈性數據庫池,以保持性能和增加可擴展性。我們目前在一台虛擬伺服器上執行 700 多個客戶;並期望為每個客戶創建一個分片數據庫。我們的想法是,我們可以從數百個客戶擴展到數万個客戶。實際上,我們正在努力讓 Azure 結構的性能接近我們在虛擬伺服器上的性能。所以這個問題是問是否有任何人在使 Azure 以合理的速度執行不平凡的任務方面具有豐富的經驗?(最好不必重寫系統的大塊)
對於這樣的問題,您需要包括查詢計劃和相關的表結構(有哪些鍵和索引)以獲得特別相關的好答案。我建議您使用該詳細資訊更新問題。
首先想到的是
JOIN
to -您要加入的列Answer
是否有有用的索引?QuestionId
一個常見的錯誤是假設定義外鍵約束也定義了索引(很像定義唯一約束),但事實並非如此。大多數 RDBMS 不這樣做,因為在某些情況下根本不需要索引,因此隱式創建索引會浪費空間並不必要地將 I/O 添加到插入和更新操作中。如果沒有有用的索引,
Answer.QuestionId
則該表將受到掃描(也可能是排序),如果該表足夠小以適合記憶體,則通常是 CPU 綁定操作。如果您在數據庫中看到很多具有相同查詢模式的情況,那麼可能是您的數據庫開發人員在添加外鍵也定義索引的假設下工作,可能是因為他們具有作為 IIRC 的 mySQL背景定義 FK 時隱式創建索引。