2011-06-21 177 views
1

我有一個存儲過程,我需要執行100次(每個參數一個)。我想知道是否可以使用批處理或類似的方法同時執行這些操作,以便加速處理而不是執行一個,然後執行下一個。SQL Server同時執行幾個命令

謝謝!

+4

這聽起來可疑地像程序性解決方案而不是基於集合的解決方案。如果您向我們展示一些代碼,我們可能會告訴您一種可以一次調用存儲過程的方式。 –

+0

你從哪裏執行proc?另一個SQL批處理或某種外部調用方式,如(線程化的......).NET程序集?另外100個並行執行並不一定會「加快」的處理 - 有你確信你沒有可能招致鎖,資源爭奪等與此PROC運行併發實例的不平凡的號碼? – pelazem

+0

我在表中記錄了我正在循環並通過proc運行它們的記錄。我正在處理200萬條記錄,並試圖找到通過所有記錄的最快方法 – Jim

回答

3

你可以重寫你的程序接受TABLE參數,填充100個值,處理表而不是100個標量嗎?

1

要直接回答您的問題,您可以打開100個單獨的連接並同時執行100個單獨的查詢。

但如前所述,我不認爲這是你的解決方案。


當你有100個值的表,看來你有幾個選項...


  • 更改StoredProcedure的一個視圖,並加入上風景。
  • 將StoredProcedure更改爲表值函數,並使用CROSS APPLY。
    (內聯函數會比多語句函數執行好了很多。)

這兩個由事實limitted,無論是景色還是一個函數可以有任何的副作用...沒有寫對錶,等等,等等


如果你不能重構代碼使用視圖或函數,你仍然需要一個存儲過程來封裝代碼。

在這種情況下,您可以:
- 將值表格作爲表值參數傳遞。
- 或直接從表中讀取存儲過程。

根據您的需要,您甚至可能希望創建一個專門供此SP讀取的表格。這引入了一些額外的問題,雖然...
- 併發:如何保持我的數據與別人分開?擁有一個字段來保存唯一的標識符,例如會話的@@ SPID。
- 清理:您不希望進程整天插入數據,但不會刪除它。


有一件事我會強烈建議您避免使用循環/光標。如果你能找到一個基於集合的方法,用它:)


編輯

你剛纔提到左邊的評價是你有百萬條記錄進行處理。

這使得更加最好使用基於集合的方法。但是,您可能會發現這會創建非常大的事務(如果您正在執行大量的INSERT,UPDATE等)。在這種情況下,仍然發現基於集合的方法,然後找到在更小的塊這樣的方式(比如說一天拆分如果數據是時間相關的,或者只是1000條記錄的時間,任何適合。)