Sql-Server
在事務複製中發布儲存過程執行
在 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中。
您可能可以採用另一種方法,例如-
- 從複製中刪除目前表。
- 您是否進行了數據更新和(為了加快速度,如果表很大,您可以截斷訂閱伺服器上的表 - 所以當您進行快照時,複製不必在訂閱者表上執行刪除)
- 使用nosync 選項將表添加回複製
- 對發布進行快照,但這次只會生成添加的表的快照。