Sql-Server

防止單個查詢佔用所有資源

  • May 6, 2019

我有一個執行 SQL Server 2008 R2 的生產數據庫伺服器。如何防止對一個數據庫的使用者查詢佔用所有系統資源並阻塞伺服器上的所有數據庫?

我遇到的具體問題是帶有長時間執行的游標的查詢。每當執行查詢時,所有核心上的 CPU 使用率都會達到 100%,甚至其他數據庫上的簡單查詢也會減慢或超時。這是正常的嗎?防止這種情況的最佳做法是什麼?

如果您使用的是企業版,則可以使用資源管理器(幾年前我為 Microsoft 寫了一篇關於此主題的白皮書)。如果您可以僅辨識此使用者(通過SUSER_SNAME()HOST_NAME()),這將特別有效。不幸的是,這不能用於僅對一個查詢施加限制——它在登錄時實現並影響會話生命週期內的所有查詢,但您當然可以總體上限制它們的 CPU。請注意,在 SQL Server 2008 和 R2 中,僅當框上存在其他爭用時才會強制執行此約束。在 SQL Server 2012 中,有一個新設置 ( CAP_CPU_PERCENT) 允許您為資源池限制 CPU,即使它們是盒子上唯一的一個。

假設您可以控制查詢文本本身(例如,它不是由使用者或他們的應用程序臨時組裝的),另一種解決問題的方法(或另一種方法)是讓該特定查詢始終執行OPTION (MAXDOP 1)- 它會仍然會導致高 CPU,並且查詢很可能需要更長的時間,但是您可以使用該設置來限制它影響的調度程序的數量。因此,在 16 核機器上,您只會看到一個 CPU 峰值作為此特定查詢的直接結果。

引用自:https://dba.stackexchange.com/questions/19144