Sql-Server-2008

SQL Server 2008 T-SQL 選擇掛起,但沒有死鎖

  • May 13, 2020

這是一個非常奇怪的問題,所以請耐心等待。我有一個儲存過程,可以進行一些繁重的處理。當它執行良好時,通常需要幾分鐘,具體取決於伺服器負載,但有時它似乎會卡住。

我查看了 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吞吐量

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