SQL Server 可用性問題:大型查詢阻止其他連線連線

SQL Server 可用性問題:大型查詢阻止其他連線連線

我有一台運行 MS SQL 2008 的高規格(多核心、RAID)伺服器,上面有多個資料庫。我有一個低吞吐量的進程,定期需要來自其中一個資料庫的少量信息,並且程式碼似乎工作正常。

然而,有時當我的一位同事對其他資料庫之一進行大量查詢時,我會看到電腦上的 CPU 使用率已滿,並且來自我的應用程式的連接逾時。

為什麼會出現這種情況?我以為許多核心和硬碟會以某種方式(與巧妙編寫的資料庫伺服器一起)能夠為其他應用程式保留至少一些可用資源?我很確定他的查詢沒有使用多個連線。

我可以做什麼來防止這種情況發生?

編輯

我沒有太多關於硬體的細節。它使用普通 HDD,raided,伺服器 2k3。這是一台已經有幾年歷史的惠普產品。基本上,硬體問題對我來說沒有意義,所以我想我可能配置有問題?

答案1

這意味著您的查詢非常不理想。普通嫌犯:

  • 無索引或索引錯誤
  • WHERE 子句中的列上的函數(= 忽略索引)
  • 資料型別轉換/優先權(= 忽略索引)
  • 在 SELECT 子句中具有表格存取的標量 udf(= CURSOR 影響)
  • 視圖查詢/與視圖連接(視圖是一個可擴展的巨集)

這也可能是一個簡單的資源問題:傳回的資料是否涉及整個資料庫,因此它使用了太多的記憶體而導致分頁?或者您是否收到 ASYNC_NETWORK_IO 等待,這可能意味著客戶端沒有盡快接受結果?

一般來說,如果您的伺服器達到了極限,那麼它是糟糕的程式碼和/或設計,而不是資料庫引擎。

答案2

只要您確定已盡可能優化,您可能需要查看並行性設定;預設是使用所有處理器進行並行查詢,您可以根據您擁有的處理器數量將其更改為較低的最大值,查詢可能需要更長的時間來運行,但它應該留下足夠的處理能力服務登入請求。如果問題僅限於此一個查詢,您可以讓您的同事透過新增 MAXDOP 選項來更改他/她的查詢,而不是更改系統範圍的設置,看看是否有幫助。

相關內容