![SQL Server 可用性問題:大型查詢阻止其他連線連線](https://rvso.com/image/515035/SQL%20Server%20%E5%8F%AF%E7%94%A8%E6%80%A7%E5%95%8F%E9%A1%8C%EF%BC%9A%E5%A4%A7%E5%9E%8B%E6%9F%A5%E8%A9%A2%E9%98%BB%E6%AD%A2%E5%85%B6%E4%BB%96%E9%80%A3%E7%B7%9A%E9%80%A3%E7%B7%9A.png)
我有一台運行 MS SQL 2008 的高規格(多核心、RAID)伺服器,上面有多個資料庫。我有一個低吞吐量的進程,定期需要來自其中一個資料庫的少量信息,並且程式碼似乎工作正常。
然而,有時當我的一位同事對其他資料庫之一進行大量查詢時,我會看到電腦上的 CPU 使用率已滿,並且來自我的應用程式的連接逾時。
為什麼會出現這種情況?我以為許多核心和硬碟會以某種方式(與巧妙編寫的資料庫伺服器一起)能夠為其他應用程式保留至少一些可用資源?我很確定他的查詢沒有使用多個連線。
我可以做什麼來防止這種情況發生?
編輯
我沒有太多關於硬體的細節。它使用普通 HDD,raided,伺服器 2k3。這是一台已經有幾年歷史的惠普產品。基本上,硬體問題對我來說沒有意義,所以我想我可能配置有問題?
答案1
這意味著您的查詢非常不理想。普通嫌犯:
- 無索引或索引錯誤
- WHERE 子句中的列上的函數(= 忽略索引)
- 資料型別轉換/優先權(= 忽略索引)
- 在 SELECT 子句中具有表格存取的標量 udf(= CURSOR 影響)
- 視圖查詢/與視圖連接(視圖是一個可擴展的巨集)
這也可能是一個簡單的資源問題:傳回的資料是否涉及整個資料庫,因此它使用了太多的記憶體而導致分頁?或者您是否收到 ASYNC_NETWORK_IO 等待,這可能意味著客戶端沒有盡快接受結果?
一般來說,如果您的伺服器達到了極限,那麼它是糟糕的程式碼和/或設計,而不是資料庫引擎。
答案2
只要您確定已盡可能優化,您可能需要查看並行性設定;預設是使用所有處理器進行並行查詢,您可以根據您擁有的處理器數量將其更改為較低的最大值,查詢可能需要更長的時間來運行,但它應該留下足夠的處理能力服務登入請求。如果問題僅限於此一個查詢,您可以讓您的同事透過新增 MAXDOP 選項來更改他/她的查詢,而不是更改系統範圍的設置,看看是否有幫助。