ASP.NET/SQL 2008 性能問題
我們開發了一個帶有搜尋螢幕的系統,看起來有點像這樣:
(來源:nsourceservices.com)
如您所見,有一些相當重要的搜尋功能。您可以使用狀態、渠道、語言、活動類型的任意組合,然後按名稱等縮小範圍。
然後,一旦您搜尋並在底部彈出潛在客戶,您就可以對標題進行排序。
該查詢使用 ROWNUM 執行分頁方案,因此我們一次只返回 70 行。
問題
即使我們只返回 70 行,大量的 IO 和排序仍在進行。這當然是有道理的。
這總是會導致磁碟隊列出現一些小的峰值。當我們達到 300 萬個潛在客戶時,它開始放慢速度,現在我們越來越接近 5,磁碟隊列有時會持續一兩秒。
這實際上仍然可行,但是該系統還有另一個區域具有時間敏感的過程,為了簡單起見,它是一個 Web 服務,需要非常快速地提供響應,否則會導致另一端超時。磁碟隊列峰值導致該部分陷入困境,從而導致下游超時。最終結果實際上是在我們基於 VoiceXML 的自動 IVR 中掉線,這對我們來說非常糟糕。
我們嘗試了什麼
我們嘗試過:
- 將系統中的引線數量減少到最低限度的維護任務。
- 添加了明顯的索引以提供幫助。
- 在分析器中執行索引調整嚮導並應用其大部分建議。其中一個將或多或少地在索引中複製整個表,因此我手動對其進行了調整,使其做得更少。
- 向伺服器添加了更多 RAM。它有點低,但現在它總是有 8 gigs 空閒,並且 SQL 伺服器配置為使用不超過 8 gigs,但它從不使用超過 2 或 3。我發現這很奇怪。為什麼不只是將整個表放在 RAM 中?它只有 500 萬個潛在客戶,而且還有足夠的空間。
- 傾瀉而下的查詢執行計劃。我可以看到,此時索引似乎主要在完成它們的工作——大約 90% 的工作發生在排序階段。
- 考慮將 Leads 表分區到不同的物理驅動器,但我們沒有資源,而且似乎沒有必要。
在關閉…
我的一部分感覺伺服器應該能夠處理這個問題。考慮到該伺服器的強大功能,500 萬條記錄並不算多,這是一個不錯的四核和 16 GB 記憶體。但是,我可以看到排序部分是如何導致數百萬行被觸摸而只返回少數。
那麼在這種情況下你做了什麼?我的直覺是我們也許應該削減一些功能,但如果有辦法保持這一點,那將避免我與業務部門的戰爭。
提前致謝!
數據庫瓶頸通常可以通過改進 SQL 查詢來改善。在不知道它們是什麼樣子的情況下,考慮創建一個按計劃填充的操作數據儲存或數據倉庫。
有時,扁平化複雜的關係數據庫是要走的路。它可以使查詢執行得更快,並且使優化查詢變得更加容易,因為模型非常平坦。這也可能使您更容易確定是否需要向上或向外擴展數據庫伺服器。容量和增長分析可能有助於做出這樣的決定。
事務/高度規範化的數據庫通常不像 ODS 或數據倉庫那樣可擴展。
編輯:您的 ORM 可能也有可能支持的優化,這可能值得研究,而不僅僅是研究如何優化它發送到數據庫的查詢。也許完全繞過您的 ORM 以獲取報告可能是完全控制您的查詢以獲得更好性能的一種方法。
