最近遇到一個在SQL Server transactional replication 裡關於CommitBatchSize 和CommitBatchThreshold設定的問題,BOL裡面的解釋很含糊:
- CommitBatchSize “Is the number of transactions to be issued to the Subscriber before a COMMIT statement is issued. The default is 100.”
- CommitBatchThreshold “Is the number of replication commands to be issued to the Subscriber before a COMMIT statement is issued. The default is 1000.”
有一個老外做了詳細的測試結果總結了關於這兩個屬性的作用,詳情見:
http://kendalvandyke.blogspot.com/2008/11/how-commitbatchsize-and.html
根據我自己的分析,這兩個屬性的作用如下:
- Distrabution Agent 將所有單條命令作為一個單位,CommitBatchThreshold和CommitBatchSize 是以單條命令數為標準
- 如果一個語句更新N條記錄,這條語句視為在一個transaction中。但是命令數為N。
- 如果命令在一個transaction中,不考慮CommitBatchSize ,只考慮CommitBatchThreshold。
- 單個transaction不會被拆分成多個,就算單個transaction中的命令數超過CommitBatchThreshold。
- 如果提交多個transaction,第一個transaction 的命令數沒有超出CommitBatchThreshold,則第二個transaction 會被合并如第一個。如果合并後的命令數超出CommitBatchThreshold,則不繼續合并,但是前兩個transactions照樣提交。
- 如果命令不在一個transaction中,按照CommitBatchSize的設定將一定數量的命令合并成一個transaction。
- 如果CommitBatchSize的值大於CommitBatchThreshold,一個CommitBatchSize的transaction會被進一步拆分成兩個,比如CommitBatchSize=5,CommitBatchThreshold=3,總命令數為10,會如下打包 4,1,4,1。為什麼會出現4,請參見第5條,因為第一個包的命令數在向後合并中到第四個命令才超過CommitBatchThreshold。於是一個CommitBatchSize的transaction 被分成兩個 4,1。