2015-10-27 38 views
1

並不是說單個存儲過程的當前設置有3件事需要太長時間。但是,當用戶可以看到一些信息量會很有用時,也許是爲了加快速度。1異步調用存儲過程3個事情與3個異步調用存儲過程做一件事情?

我有一個存儲過程與async/await模式一起運行,並返回3個獨立的數據集。他們中沒有一個需要其他任何2個,所以順序和誰先完成是沒有問題的。因此,用戶在整個SP運行並返回之前都不會在網頁上看到任何內容。

除了更多的代碼,這是不可取的,將這個SP分成3個獨立的SP並且對這些SP有3個獨立的async調用會更有意義嗎?

在旁註中,仍然會有單個SP,但是新的@Which參數有意義嗎?含義當@Which = 1查詢該數據,當@Which = 2查詢該數據等。或者是否會出現某種滯後,試圖通過3個獨立的async呼叫多次運行相同的SP?

我已經做了一些研究 - Why should I prefer single 'await Task.WhenAll' over multiple awaits?是很好的信息,但不是真的爲我的問題。

回答

2

與往常一樣,這確實沒有正確或錯誤的答案。但是,有專門解決這個問題的開發模式。

我不相信存儲過程返回多個結果集是一件壞事,但是您提到結果集是彼此獨立的。我對該陳述的理解是,SP正在執行3個不同的工作單元,並且可以,應該並且將具有不依賴於操作的另一部分的結果的結果集。我相信這會使單一責任原則無效。 https://en.wikipedia.org/wiki/Single_responsibility_principle

如果您不得不更新存儲過程的一部分,您現在必須觸摸整個存儲過程,並可能改變與所請求的更改無關的內容。

如果您曾經只需要獲取存儲過程結果的一部分,您仍然必須在過程中獲取所有結果集,也許沒有理由。

現在我可能會爭辯說,如果所有3個結果集依賴於相同的工作集數據,這將是一個可接受的方法。需要保證它們在所有結果集中相似的工作集。比如說一個詳細的結果集和幾個不同的聚合版本,或者是一些具有特定連接條件的東西。理想情況下,還有其他方式來處理其中的一些。

從數據庫可維護性的角度來看,我建議使這3個獨立的調用/存儲過程。

1

是的,假設三個SP不會相互競爭,您應該能夠將它們分成3個或者在參數中內部存儲相同的proc分支,沒有任何問題。你選擇哪兩個選項是個人喜好,但如果他們在做3個獨立的事情,我會選擇3個sprocs。

+0

好點,這三組記錄都只是從3種不同的方式查看相同的數據,日期,供應商和金額。所以如果我有3個單獨的SP試圖擊中相同的記錄,那可以嗎?慢下來。 – Grandizer

相關問題