任何 SQL Server 多記錄集儲存過程的陷阱?
語境
我目前的項目是一個大型的公共站點(每天 200 萬次瀏覽量)站點,它混合了 asp classic 和 asp.net 以及 SQL Server 2005 後端。我們重讀,偶爾寫,幾乎沒有更新/刪除。我們的頁面通常涉及單個“主”對象和一堆相關(詳細)對象。
我喜歡在單個過程中返回頁面所需的所有數據的想法(絕對沒有不必要的數據)。誠然,這需要此類頁面的專用 proc,但有些頁面在我們的整體網站流量中佔兩位數百分比,因此值得花時間/維護。我們通常只使用 System.Data.SqlClient.SqlDataReader 及其 NextResult 方法從我們的 .net 程式碼中使用多個記錄集。哦,是的,我也沒有在這些過程中進行任何更新/插入(表變數除外)。
問題
到目前為止,返回多個記錄集的 SQL Server (2005) proc 對我們來說執行良好(在 prod 中),但我有點擔心多記錄集 proc 是我最喜歡的新錘子,我正在用它來解決每個問題(釘子)。有沒有我應該知道的多記錄集 sql server proc 陷阱?有什麼東西會讓我希望我沒有使用它們嗎?特別是關於它影響連接池、記憶體使用率等的任何事情。
以下是多記錄集儲存過程的一些陷阱:
它們使重用程式碼變得更加困難。 如果您正在執行多個查詢,那麼您很可能能夠在另一個頁面上重用其中一個查詢。
它們使單元測試變得更加困難。 每次對其中一個查詢進行更改時,都必須測試所有結果。如果發生了變化,您必須深入了解哪個查詢未通過單元測試。
它們使以後調整性能變得更加困難。 如果另一個 DBA 在你身後幫助你提高性能,他們必須做更多的切片和切塊來找出問題的根源。然後,將其與程式碼重用問題結合起來——如果他們優化了一個查詢,那麼該查詢可能會在幾個不同的儲存過程中使用,然後他們必須修復所有這些——這使得再次進行更多的單元測試。
它們使錯誤處理變得更加困難。 儲存過程中的四個查詢可能會成功,而第五個會失敗。你必須為此做好計劃。
它們會增加鎖定問題並在 TempDB 中產生負載。 如果您的儲存過程的設計方式需要可重複讀取,那麼您在儲存過程中填充的查詢越多,執行所需的時間就越長,將這些結果返回到您的應用伺服器所需的時間也就越長. 增加的時間意味著更多的鎖爭用,並且 SQL Server 必須在 TempDB 中儲存更多以進行行版本控制。您提到您的閱讀量很大,因此這個特定問題對您來說應該不會太糟糕,但您希望在將這個錘子重用於寫入密集型應用程序之前了解它。