簡體   English   中英

8個嵌套存儲過程的性能問題

[英]Performance problem with 8 Nested Stored Procedures

我有性能問題
我需要從.Net 1.1運行存儲過程。 此存儲過程調用8個存儲過程。 他們中的每一個都處理信息,以便在舊的新信息和anter之間進行比較,從而影響DataBase中的物理表。

問題來了,因為我嘗試直接從SSMS運行它。 服務器開始崩潰,變得如此緩慢,幾乎無法工作。 我認為基礎架構人員必須直接在服務器上重新命名服務。

我在開發環境中工作,所以沒有太多問題,但我無法將其上傳到生產環境中。

我一直在考慮使用過程僅用於比較目的,而從不影響物理數據。 在主要過程的臨時表中從它們中檢索信息,然后打開我的try-catch和開始 - 結束事務塊,並影響我的主體中存儲有Temp表中信息的數據庫。

我的主要存儲如下:這是我做到這一點的最佳方法嗎?

create proc spTest
as
/*Some processes here, temporary tables, etc...*/
begin try
begin distributed transaction
sp_nested1
sp_nested2
sp_nested3
sp_nested4
sp_nested5
sp_nested6
sp_nested7
sp_nested8
/*more processes here, updates, deletes, extra inserts, etc...*/
commit transaction
end try
begin catch
rollback transaction
DECLARE @ERROR VARCHAR(3000)
SELECT @ERROR = CONVERT(VARCHAR(3000),ERROR_MESSAGE())
RAISERROR(@ERROR,16,32)
RETURN
end catch

每個嵌套存儲過程的基本結構類似,但不調用任何其他過程,只有每個過程都有自己的try和catch塊。

任何幫助將不勝感激...我使用的版本是SQL Server 2005

謝謝大家....

首先,當事情變得緩慢時,你寫的內容可能會出現問題。 首先要看的是每個存儲過程的執行計划。 您有表格掃描嗎?

您是否單獨運行了每個程序,並且看到每個程序有多快? 這將幫助您定義問題是8個過程還是其他東西。 您似乎需要執行很多步驟,過程可能是也可能不是問題。

您是使用游標或while循環還是標量用戶定義函數或相關子查詢逐行處理數據? 這會極大地影響速度。 您有正確的索引編制嗎? 您的查詢語句是否可存儲? 我看到您有一個分布式事務,您確定運行proc的用戶在其他服務器上是否具有正確的權限? 服務器是否存在並且正在運行? 您是否在temp數據庫中空間不足? 您是否需要分批運行此程序,而不是嘗試在多個服務器上更新數百萬條記錄?

沒有看到這個混亂,很難確定可能導致它減速的原因。

但我將分享我如何處理長期復雜的過程。 首先,他們都有一個測試變量,我用它來回滾最后的事務,直到我確定我正在采取正確的行動。 我還在返回之前返回插入的結果。 現在,這最初並不能解決速度問題。 但無論如何要設置它,因為如果你無法弄清楚執行計划會出現什么問題,那么你想要做的就是注釋掉除了第一步之外的所有內容並在測試模式下運行proc(並回滾)然后不斷添加步驟,直到看到它被卡住為止。 當然,它可能不止一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM