分發器延遲 - sp_MSget_repl_commands 性能緩慢
我們的一個發布者由三個訂閱者訂閱,每個訂閱者都託管在自己的物理伺服器上。其中兩個訂閱者是 2008R2 和第三個 2012。2012 年訂閱者在高峰時段每天都會遇到延遲。
在執行了幾天的一些擴展事件跟踪之後,我可以看到延遲與分發器處的 sp_MSget_repl_commands 執行時間緩慢有關,更具體地說,在第 724 行找到的最終選擇查詢“–Mini join together。只有 agent_id 和dbo.MSsubscriptions 中的 article_id 列”。此語句的執行時間可能 >= 20 分鐘。
在開始將複製的命令寫入命令緩衝區之前,分發器讀取器執行緒是否等待 sp_MSget_repl_commands 的整個執行完成?或者它是否在 SP 返回後立即將複製的命令寫入命令緩衝區?我看到有問題的陳述是用 OPTION (FAST 1) 暗示的,這可能表明情況就是這樣。如果讀取器執行緒在開始將複製的命令寫入命令緩衝區之前確實等待 sp_MSget_repl_commands 完成,那麼這可能會解釋延遲,否則我不確定。還有什麼明顯的我可以監控的嗎?
MSdistribution_history.comments 表明劫持發生在訂閱者處。但是,沒有複製的訂閱者儲存過程在 >= 100 毫秒內完成,並且沒有明顯的物理伺服器資源爭用。我已經排除了網路,因為在同一物理伺服器上還有其他訂戶數據庫通過同一網路填充,這些數據庫沒有遇到延遲。
在一定程度上回答我自己的問題。一旦 sp_MSget_repl_commands 使命令可用,命令似乎就被寫入命令緩衝區。如果編寫器執行緒無法將命令寫入訂戶,則 sp_MSget_repl_commands 將旋轉直到命令被寫入。一旦寫入,寫入器就會通知讀取器並為下一批命令釋放兩個命令緩衝區中的一個。這解釋了 sp_MSget_repl_commands 的長時間執行。