SQL Server 2008 T-SQL 選擇掛起,但沒有死鎖
這是一個非常奇怪的問題,所以請耐心等待。我有一個儲存過程,可以進行一些繁重的處理。當它執行良好時,通常需要幾分鐘,具體取決於伺服器負載,但有時它似乎會卡住。
我查看了 sp_who2 的結果,我看到該程序沒有被阻塞,它仍然列為“RUNNABLE”,但磁碟 IO 中的值保持不變。一旦程序進入這種狀態,它就永遠不會結束。如果我終止程序並重新執行儲存過程,我通常會得到相同的結果。
有時重新執行儲存過程可以工作,但我最終不得不重新啟動 SQL Server。不理想…重新啟動後,儲存的過程按預期執行。有沒有人遇到過這樣的問題?任何建議將不勝感激。
更多的上下文。我正在執行的儲存過程如下所示:
delete from table1 insert into table1 select columns from ( select columns from giant_table_1 WITH (NOLOCK) where condition group by columns UNION select columns from giant_table_2 WITH (NOLOCK) where condition group by columns ) where condition more crud on table1 . . .
如果我在儲存過程中插入一些日誌記錄語句,我可以看到當它掛起時它掛在插入/選擇上。想知道這是否是 NOLOCK 語句的奇怪結果。我們(我的意思是我的老闆 :))添加了 nolock,因為 Giant_table_1 和 Giant_table_2 不斷被更改。如果沒有 nolock,我們的 sproc 就會被其他長時間執行的程序阻塞很多,反之亦然。
提前致謝!
自從將我的儲存過程重構為有 2 個插入而不是一個大的聯合插入後,我再也沒有遇到過這個問題。這有點可疑,但我不知道在這裡還能用什麼來回答。謝謝大家的建議。
從您查詢的外觀來看,我相信該程序正在等待溢出到 tempdb。您將需要查看的輸出
SELECT * FROM sys.dm_os_waiting_tasks WHERE session_id = <SPID for the SP>
為了更好地了解後台發生的事情,Adam Machanic 的sp_whoisactive是一個很好的工具,用於簡化有關查詢執行的詳細資訊的收集。
還要確保為您的數據庫和 tempdb 正確設置了自動增長,並為數據和日誌提供合理的自動增長量,並且日誌文件中的 VLF 數量低於 100。查看他的文章了解詳細資訊8 Steps to better Transaction Log吞吐量