我正在執行使用SQL Server 2005中的SQL Server代理作業的存儲過程。SQL Server代理作業運行緩慢
此作業運行速度很快,直到昨天。從昨天開始,這項工作需要1個多小時而不是2分鐘。
我在SSMS中執行存儲過程,它只需要不到1分鐘的時間執行。
我想不通爲什麼它作爲SQL Server代理作業執行需要1個多小時?
我正在執行使用SQL Server 2005中的SQL Server代理作業的存儲過程。SQL Server代理作業運行緩慢
此作業運行速度很快,直到昨天。從昨天開始,這項工作需要1個多小時而不是2分鐘。
我在SSMS中執行存儲過程,它只需要不到1分鐘的時間執行。
我想不通爲什麼它作爲SQL Server代理作業執行需要1個多小時?
一段時間後,註釋和假設SP以相同的輸入參數和數據表現良好時,在SSMS執行,我finnaly想我可以給一個最後提示:
根據SP內執行什麼動作(例如,在循環或遊標中插入/更新/刪除大量數據),則應在代碼的開始處設置nocount。
set nocount on
如果不是這種情況,或者不幫助,請添加更多的信息,在評論中已經提到的(例如工作和各Jobstep的所有設置,哪些已經登錄,什麼是在Jobhistory,檢查SQLerrorlogs,eventlogs,....)。 也可以看看「SQL Server日誌」,也許你可以在這裏收集一些信息。此外,查看數據庫服務器的應用程序/系統事件始終是一個好主意。 要獲得基本概述,您可以使用SSMS中的Activitymonitor,方法是選擇Databaseserver並從上下文菜單中選擇「活動監視器」並搜索sql代理。
我最後的嘗試將嘗試運行代理的sql跟蹤。在這種情況下,您將開始跟蹤並過濾由用戶表示SQLAgent服務運行。有很多選項可以設置跟蹤,所以我會建議谷歌它,搜索MSDN或在這裏問stackoverflow另一個問題。
「SET NOCOUNT ON」爲我做了詭計。 –
我注意到,SQL代理作業忽略服務器的MAXDOP設置並運行MAXDOP爲1的所有內容。如果我在查詢窗口中運行存儲過程,它服從服務器設置並使用4個進程。如果我使用SQL代理,我運行的任何存儲過程只使用一個進程。
我有一個調用我創建的UDF數量的腳本的類似問題。 UDF本身通常在SSMS下運行亞秒。同樣,運行我用它們生成的報告在SSMS(30s數據8s,22s 365d數據)下是可承受的。我一直使用我的SQL代理作業完成NOCOUNT ON,因爲它們通常會生成文本文件供其他進程或Excel進行拾取,並且我不希望最終有額外的數據,所以它不是我的解決方案。
在這種情況下,當我們運行SQL下代理完全相同的腳本工作,我的時間成倍增長。我的8s腳本需要2m30s,我的22s腳本需要2h20m。無論我是在中午與其他用戶活動和作業一起運行,還是在沒有用戶活動的時間之後運行,也無需運行作業或備份,這都是一樣的。我們的服務器處於空閒狀態,最多隻能運行8個內核之一。數據庫只有大約10GB的SSD在緩存RAID卡上運行,16個32GB RAM是免費的。由於我的SQL在SSMS中高效運行,我相信我正在達到某種線程限制。我已經研究並試圖在SQL Agent中的腳本之前調整MAXDOP,但沒有運氣。
由於這是我想要安排的一項活動,因此需要以某種方式進行自動化。我可以讓這些腳本花費他們需要的時間來作爲SQL代理作業中的SQL步驟運行,但是我決定從命令行運行,而獲得與我在SSMS中看到的相同的性能。
sqlcmd -S SQLSRVRHost -i "C:\My Script Loc With Spaces.sql" -v MyVar="VarValue" >"C:\MyOutputFile.txt"
所以我創建了一個批處理腳本,其中包含從sqlcmd運行的SQL作業。然後,我從SQL Agent作業運行批處理腳本,因此我仍然擁有相同的管理和控制。我的4個SQL作業共同花費了3個小時才能在1分鐘內完成運行,並且從SQL代理執行的單個批處理腳本運行幾秒鐘。
我希望這有助於...
我們有在SSMS88秒和SQL Server代理30-45分鐘一班大PROC。我加了dbo。所有表名都有前綴,現在它的運行速度與SSMS一樣快。
如果您在SSMS中執行了相同的SP並且它可以工作,那麼可能是Job的設置發生了變化,例如它在錯誤的數據庫上執行。如果沒有,請檢查活動監視器代理正在執行的操作,或啓動跟蹤以獲取執行的命令。也許有鎖定問題。如果您手動執行作業,問題是否仍然存在? –
@Bernhard,謝謝你的迴應。我檢查了這個工作並重新創建了它。仍然是同樣的問題。是的,如果我手動執行作業,它仍然需要很長時間 – Prateek
@Preteek你可以發佈作業的設置嗎?我能想到的唯一原因是SP的執行不同。由於參數等與手動執行時相同,SQLServer應該使用相同的執行計劃等。也許你可以看看SQL日誌 - 也許這會給我們一個提示。 –