Sql-Server

在事務複製中發布儲存過程執行

  • July 30, 2021

在 SQL 2008 R2 中,我將更新一個將影響 2500 萬行的表,該表目前正在複製(事務複製)。為了盡量減少對複制的影響,我可以創建一個儲存過程,將更新語句包裝在儲存過程中並添加這個儲存過程進行複制嗎?

通過在執行儲存過程時執行此操作,它將複製儲存過程的執行。我的問題是 SQL 伺服器如何知道只複製儲存的 proc 執行(即實際的 exec myupateproc t-sql 命令)而不是在發布者上更新的基礎表數據(即實際複製 2500 萬更新語句)?

SQL 伺服器如何知道只複製儲存過程的執行(即實際的 exec myupateproc t-sql 命令)而不是在發布者上更新的底層表數據(即實際複製 2500 萬條更新語句)?

SQL Server 知道,當您設置文章屬性時,如下所示:

在此處輸入圖像描述

您可以在設置 Article 屬性時顯式設置僅複製 SP 定義、SP 的執行或 SP 的序列化事務中的執行。

參考這裡。當您選擇“SP 的序列化事務”時,通過減少事務複製成本,整個執行被複製為單個事務,通過儲存過程執行的複制,複製僅發送在訂閱伺服器上執行儲存過程的命令,而不是將所有更新寫入分發數據庫,然後通過網路將它們發送到訂閱伺服器

事先對其進行測試,因為執行如此大的更新(2500 萬行)對於複製來說將是太多的處理(取決於您的複制拓撲 - 與發布者相同的分發伺服器,地理上分開的發布者和訂閱者等)以及所描述的一些警告在BOL中。

您可能可以採用另一種方​​法,例如-

  1. 從複製中刪除目前表。
  2. 您是否進行了數據更新和(為了加快速度,如果表很大,您可以截斷訂閱伺服器上的表 - 所以當您進行快照時,複製不必在訂閱者表上執行刪除)
  3. 使用nosync 選項將表添加回複製
  4. 對發布進行快照,但這次只會生成添加的表的快照。

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