SqlServer 復(fù)制中將大事務(wù)分成小事務(wù)分發(fā)的方法
在sql server 復(fù)制中,當(dāng)在發(fā)布數(shù)據(jù)庫(kù)執(zhí)行1個(gè)大事務(wù)時(shí),如一次性操作 十萬(wàn)或百萬(wàn)以上的數(shù)據(jù)。當(dāng)操作數(shù)據(jù)在發(fā)布數(shù)據(jù)庫(kù)執(zhí)行完成后 ,日志讀取器代理將掃描事務(wù)日志,一次性傳遞到分發(fā)數(shù)據(jù)庫(kù)中。若上個(gè)事務(wù)未傳遞完成,連續(xù)執(zhí)行多個(gè)事務(wù),日志讀取器代理將掃描日志中多個(gè)事務(wù)同時(shí)傳遞到分發(fā)數(shù)據(jù)庫(kù)中,默認(rèn)最大掃描500個(gè)事務(wù)。如果執(zhí)行多次上百萬(wàn)或千萬(wàn)的數(shù)據(jù)將堵塞很久。
日志讀取器代理可配置將大事務(wù)劃分為多個(gè)小事務(wù)進(jìn)行傳遞到分發(fā)數(shù)據(jù)庫(kù)中,分發(fā)隊(duì)列則按照小事務(wù)分發(fā)到訂閱數(shù)據(jù)庫(kù)中,這樣數(shù)據(jù)就很快同步!
在沒改代理參數(shù)之前,本人執(zhí)行1次插入30萬(wàn)的數(shù)據(jù)到發(fā)布表中。插入完成后,監(jiān)控發(fā)布到分發(fā)的記錄如下:

可以看到,這1個(gè)事務(wù)的命令都得一次傳遞完才能分發(fā),而分發(fā)又消耗時(shí)間,這里等待太久影響事務(wù)的實(shí)時(shí)性。
如果還有其他事務(wù),默認(rèn)500(參考參數(shù):-ReadBatchSize),也將一起傳遞,耗時(shí)較長(zhǎng)。
現(xiàn)在更改參數(shù),掃描到 1000 左右的命令就即時(shí)分發(fā),需要設(shè)置如下參數(shù):
-MaxCmdsInTran number_of_commands

注:該參數(shù)只能添加到日志讀取器代理中,在代理配置文件沒有此參數(shù)的設(shè)置。
添加后重啟 日志讀取器代理。
再次插入 30 萬(wàn)的數(shù)據(jù)!~到監(jiān)視器查看

可以看到,命令達(dá)到 1000 左右就進(jìn)行分發(fā)了,此時(shí)查看訂閱數(shù)據(jù)庫(kù),數(shù)據(jù)也同步過來(lái)了,這樣就省去了較多掃描命令的時(shí)間。
更詳細(xì)查看每個(gè)事務(wù)的命令數(shù),如下:
SELECT top 10 A.xact_seqno,A.entry_time,COUNT(*) AS cmds FROM distribution.dbo.MSrepl_transactions A(NOLOCK) INNER JOIN distribution.dbo.MSrepl_commands B(NOLOCK) ON A.xact_seqno=B.xact_seqno GROUP BY A.xact_seqno,A.entry_time ORDER BY cmds DESC

這個(gè)參數(shù)雖好,但是也可能引起數(shù)據(jù)的一致性。
如:
在發(fā)布更新了一批數(shù)據(jù),但是訂閱查詢時(shí)卻有不同。
分發(fā)事務(wù)遇到?jīng)_突或者死鎖,也導(dǎo)致這部分的數(shù)據(jù)不一致。
相關(guān)文章
MSSQL數(shù)據(jù)庫(kù)占用內(nèi)存過大造成服務(wù)器死機(jī)問題的解決方法
有時(shí)候我們的服務(wù)器使用MSSQL數(shù)據(jù)庫(kù),但如果MSSQL數(shù)據(jù)庫(kù)占用內(nèi)存過大可能導(dǎo)致服務(wù)器死機(jī),這里分享下解決方法, 需要的朋友可以參考下2013-07-07
sql server日期相減 的實(shí)現(xiàn)詳解
本篇文章是對(duì)sql server日期相減的實(shí)現(xiàn)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
SQL Server 數(shù)據(jù)太多優(yōu)化的方法
本文介紹了幾種優(yōu)化SQLServer數(shù)據(jù)庫(kù)性能的方法,包括索引優(yōu)化、數(shù)據(jù)分區(qū)和分表、數(shù)據(jù)歸檔、存儲(chǔ)和硬件優(yōu)化、數(shù)據(jù)庫(kù)參數(shù)和配置優(yōu)化、批量數(shù)據(jù)處理、清理無(wú)用數(shù)據(jù)、使用緩存、并行查詢與并發(fā)以及SQLServer實(shí)例優(yōu)化,這些方法可以幫助在處理大量數(shù)據(jù)時(shí)保持較好的性能2024-11-11
sqlserver 中時(shí)間為空的處理小結(jié)
sql server中常常需要使用DateTime類型的字段。當(dāng)此類型字段值為空時(shí),常常出現(xiàn)各種異常2011-10-10
SQL SERVER 中構(gòu)建執(zhí)行動(dòng)態(tài)SQL語(yǔ)句的方法
這篇文章主要介紹了SQL SERVER 中構(gòu)建執(zhí)行動(dòng)態(tài)SQL語(yǔ)句的方法,需要的朋友可以參考下2017-06-06
SQL?server數(shù)據(jù)庫(kù)declare和set用法技巧小結(jié)
這篇文章主要給大家介紹了關(guān)于SQL?server數(shù)據(jù)庫(kù)declare和set用法技巧的相關(guān)資料,在SQL Server中,DECLARE用于聲明變量和存儲(chǔ)過程中的參數(shù),文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08
將Reporting services的RDL文件拷貝到另外一臺(tái)機(jī)器時(shí)報(bào)Data at the root level i
在本機(jī)開發(fā)了一個(gè)Reporting后拷貝到服務(wù)器,然后在Sql Server Business Intelligence Development Studio中添加再打開后會(huì)報(bào)Data at the root level is invalid.錯(cuò)誤2012-06-06

