Sql-Server
並行執行儲存過程
我希望嘗試使用不同的參數但同時執行相同的儲存過程。
我正在使用 SQL 2014
原因是該過程大約需要 7 個小時才能完成。它實際上多次執行相同的過程。因此,例如,它可能會為每個分支建構一個新的數據庫和表。
我想要做的是分解儲存過程,以便我可以在每個分支中執行,然後並行執行每個查詢。我已經通過在單獨的查詢視窗中執行它來測試它,它的執行速度快了近 80%。
誰能給我一個虛擬指南來並行執行查詢?
有一次,我在 StackOverflow 上回答了這個問題,但在 DBA.SE 上也有這些資訊,修改和更新似乎很有用。
完全明確地說:TSQL(本身)不具備非同步啟動其他 TSQL 操作的能力。
這並不意味著您仍然沒有很多選擇(其中一些在其他答案中提到):
- SQL 代理作業:創建多個 SQL 作業,並安排它們在所需的時間執行,或者使用
sp_start_job
. 如果您需要以程式方式監控它們的進度,只需確保每個作業都更新自定義 JOB_PROGRESS 表(或者您可以使用Gregory A. Larsen的這篇優秀文章xp_sqlagent_enum_jobs
中描述的未記錄函式檢查它們是否已完成)。您必須創建與執行並行程序一樣多的單獨作業,即使它們正在執行具有不同參數的相同儲存過程。- SSIS 包:使用簡單的分支任務流創建一個 SSIS 包。SSIS 將在單獨的 spid 中啟動這些任務,SQL 將並行執行這些任務。
- 自定義應用程序:使用您選擇的語言(C#、Powershell 等),使用該語言提供的非同步方法編寫一個簡單的自定義應用程序。在每個應用程序執行緒上呼叫 SQL 儲存過程。
- OLE 自動化:在 SQL 中,使用
sp_oacreate
和sp_oamethod
啟動一個新程序來呼叫彼此的儲存過程,如本文所述,同樣由 Gregory A. Larsen 撰寫。- Service Broker:研究使用Service Broker ,這是本文中非同步執行的一個很好的例子。
- CLR 並行執行:使用 CLR 命令
Parallel_AddSql
,Parallel_Execute
如Alan Kaplan的這篇文章中所述(僅限 SQL2005+)。- 計劃的 Windows 任務:為了完整性而列出,但我不喜歡這個選項。
如果是我,我可能會在更簡單的場景中使用多個 SQL 代理作業,在更複雜的場景中使用 SSIS 包。
在您的情況下,除非您嘗試啟動 200 個單獨的執行緒,否則多個計劃的代理作業聽起來像是一個簡單且易於管理的選擇。
最後一條評論:SQL 已經盡可能地嘗試並行化各個操作*。這意味著同時執行 2 個任務而不是一個接一個地執行並不能保證它會更快完成。仔細測試,看看它是否真的改善了任何東西。
我們有一個開發人員創建了一個 DTS 包來同時執行 8 個任務。不幸的是,它只是一個 4-CPU 伺服器 :)
*假設預設設置。這可以通過更改伺服器的最大並行度或親和遮罩,或使用 MAXDOP 查詢提示來修改。
您最好的選擇是創建三個具有相同時間表的獨立作業,以便同時啟動這些作業。根據工作正在做什麼,您應該小心監控阻塞和死鎖。
另一種選擇是創建一個包含 N 個運算符的 SSIS 包以並行呼叫 SP