2014-04-14 45 views
1

我有大量的存儲過程(約200),需要按順序執行。理想情況下,我想創建一個單獨的「主」存儲過程,它將逐個執行每個單獨的存儲過程。SQL Server - 存儲過程比較「巨」腳本

但是,當我執行主存儲過程時,它會在運行很長時間後始終凍結。話雖如此,如果我從200個獨立存儲過程中獲取所有SQL代碼並創建一個巨大的SQL腳本文件,它將毫無問題地運行。

SQL代碼查詢單獨的表並將數據的子集插入到主「摘要」表中。

任何想法,爲什麼會發生這種情況?存在需要更多內存的存儲過程嗎?我寧願將所有內容保存在存儲過程中,以便我們可以更輕鬆地管理安全性和更新。

+0

是否有任何存儲過程創建,修改或刪除任何其他存儲過程?其他對象類型呢? – RBarryYoung

+0

否。存儲過程不會修改其他存儲過程。他們查詢其他表並將該數據的子集插入到單獨的聚合表中。 – webworm

+0

然後你應該看看主sproc凍結時'sp_lock'的輸出。它顯示了什麼? – RBarryYoung

回答

1

任何想法爲什麼會發生這種情況?

彙編。

主腳本很可能是使用此時有效的統計信息逐批編譯的。

SP將在啓動時編譯一次,如果統計數據在運行過程中發生變化 - 就像一系列負載一樣 - 您可以繼續。特別是如果統計變化在處理過程中顯着。基本上,開始時的統計數據(當編譯事物時)與某些表的運行時統計數據完全不同。

有一個重新編譯選項,您可以選擇單個語句來避免這種情況。

+0

但是大的SP是有效的。主腳本是鎖定的腳本。 – RBarryYoung

+1

這我不是你說的。讓我引用:但是,當我執行主存儲過程時,它會在運行很長時間後始終凍結。話雖如此,如果我從200個獨立存儲過程中獲取所有SQL代碼並創建一個巨大的SQL腳本文件,它將毫無問題地運行。 – TomTom

+0

我不是OP,但是你所引用的內容與我上面所說的相同:主腳本/ sproc凍結,大腳本/ sproc工作。請注意,SQL問題海報經常會在腳本和sprocs之間做出很差的區分(我懷疑是Oracle的影響力)。我所看到的兩者之間的明顯區別是「主人」(稱他人)與「大」(全部在一起)。 – RBarryYoung