Sql-Server

如何同時從多個表插入目標表..?

  • January 17, 2017

我有一個每月一次的單執行緒程序,它恢復大約 2,000 個數據庫並將數據泵入表中,然後刪除數據庫。插入完成大約需要 18 小時(通過 SSIS 包)。我怎樣才能使這個多執行緒;避免目標表上的鎖定/死鎖。我曾考慮過分區切換,但它不起作用,因為目標必須以目標表中的一個分區結束。

那麼這篇文章是給你的。

直接引用您的多執行緒問題。

決定可以並行執行多少個執行檔的包屬性是 MaxConcurrentExecutables,如圖 2 所示。預設為 -1,這意味著控制流引擎將使用伺服器上的邏輯處理器數加 2。例如,如果您在四核伺服器上使用預設設置執行包,則最多可以有六個並行執行的執行檔。

本文將討論避免阻塞和鎖定,並應該給你足夠的例子和想法,讓你自己研究問題。評估將發生哪些類型的鎖和阻塞以及您需要的隔離級別將幫助您避免阻塞和鎖定。

根據您輸入的內容,死鎖聽起來不像是您會遇到的問題。這是一個很好的解釋它是如何發生的。

澄清一下,你有一個 SSIS 包,它:

  • 恢復 2000 個數據庫的列表
  • 將這 2000 個數據庫中的每一個數據庫中的數據提取到中央(永久)數據庫中的分區表中,然後
  • 刪除源數據庫?

假設您正在使用多核伺服器,我認為您會通過以下方式看到性能的良好提升:

  1. 複製您的包,並使每個包負責數據庫的相等子集(假設 10 個包每個負責 200 dbs)
  2. 通過單獨的 SQL 代理作業安排每個任務,即使它們都同時啟動。這些作業/包將同時執行,這是一種“便宜且簡單”的 SQL 多任務處理形式。
  3. 恢復會爭用 IO,但不應該互相阻塞
  4. 插入可能會相互競爭以獲取表訪問權限,您可能必須使用數據複製設置來優化此設置
  5. 讓 SQL 處理其餘部分。完成的包可以繼續執行其他任務(刪除數據庫,恢復下一個)。

您可能必須使用包的數量才能使其正確。

另一個構想:如果這個月度導入的數據構成了這個月度分區表的一個全新月份,那麼一定要將所有新數據導入到一個全新的(空)表中,然後使用“滑動視窗”技術滾動它進入主表,影響為 0。請參閱在 SQL Server 中管理滑動視窗

引用自:https://dba.stackexchange.com/questions/161359