首页 > 数据库 >[转]SqlServer大量更新引起同步链延时问题

[转]SqlServer大量更新引起同步链延时问题

时间:2023-10-31 09:35:27浏览次数:41  
标签:订阅 同步 TestTb ustate -- SqlServer 更新 延时

前言:

 

   在SQLServer数据库中,当我们对一个位于同步链上的表进行更新时,如果更新的记录数也非常多,几百或是几千万,那么批量更新该表会造成同步链的大量延时(甚至有可能崩溃掉,即使同步链不崩溃,等的人也要崩溃了)。

 

 原因:

 

  一般情况下,Replication是根据我们更改的数据一条条更改记录的,也就是说我们在发布端下达如下的语句:

 

update TestTb set TT='xxxx' where ustate=0

 

如果这条更新语句,修改的数据量是一千万条的话,那Replication同步链需要传递一千万条如下的语句到订阅端去执行:

 

exec [dbo].[sp_MSupd_dboTestTb] default,'xxxx',default,2,0x02

 

如果我们有8台订阅端,而我们更新的数据也不是这么简单的数据的话(如更新一些nvarchar(1000)之类的),这个数据流量是非常恐怖的。

 

解决办法:

  基于以上原因,我们在对同步链上的表进行大规模更新操作时,必须要非常小心,避免数据的大量更新;但是如果业务有此要求,必须要在同步的表上更新这么多数据量,如何办呢?

 

1.  如果你已经在发布端直接运行了类似上面的语句,那就只有一个字:“等”(当然也可以将表从同步链中去掉);

 

2.  我们可以采用分批处理的方式来更新同步链,一批次处理几百或者一千条数据,处理完一批后,等待10s钟,再运行下一批,类似语句如下(常用):

 

DECLARE @count int

       ,@sumcount int

       ,@subcount int

SET @sumcount=0

set @subcount=0

SELECT

    @count=COUNT(0)

FROM TestTb where ustate=0

WHERE ustate=0

 

WHILE(@sumcount<@count and @subcount >= 1000)

begin

   UPDATE TOP (1000) TestTb

   SET TT='XXXX' where ustate=0

   set @subcount=@@ROWCOUNT

   set @sumcount=@sumcount+1000

   waitfor delay '00:00:10'

end

 

3.  如果更新的数据很大,用第二种方法将会消耗很长的时间,等不起呀;有没有更好的方法呢?我们可以通过使用临时存储过程来更新数据,下面我们通过一个实例来看看如何操作:

 --新建一个测试表

CREATE TABLE TestTb

(

     id int identity(1,1) primary key ,

    ,name varchar(20)

    ,ustate smallint

)

 

--插入测试数据

insert into TestTb(name,ustate)

values('AAAAA',0),

('BBBBB',1),

('CCCCC',0),

('DDDDD',1),

('EEEEE',0),

('FFFFF',1)

 

--新建一个存储过程

create proc usp_updateTestTb

as

begin

  update TestTb set name='KKKKKK' where ustate=1

end

 

我们把表TestTb 和 usp_updateTestTb 都建到同步链上,需要注意的是,TestTb表结构在订阅端需要将Identity 属性去掉;usp_updateTestTb需要选择同步更改和运行,即将同步的Replicate属性 选为“Execution of the stored procedure”,这样在发布端执行存储过程时,订阅端也会执行相应的存储过程,而不是分条执行存储过程中影响的每一条语句;

 

 

同步建好后,我们在订阅端打开Profile,选择我们要跟踪的库,然后在订阅端做以下测试:

--先查下满足记录的条数

 select * from TestTb where ustate=1

 

    

--直接运行更改语句

 update TestTb set name='PPPPPP' where ustate=1

 

(3 row(s) affected)

 

--更改后订阅端的数据

select * from TestTb

  

我们到订阅端的Profile中去看看传递过来的语句情况:

s

可以看到有三条语句传过来了;

 

接下来我们运行存储过程usp_updateTestTb,这个SP也是更新TestTb中三条数据,我们看看Profile中又有什么信息


 

--发布端运行usp_updateTestTb

exec usp_updateTestTb

 

(3 row(s) affected)

 

--订阅段数据

select * from TestTb

 

    

 

订阅端Profile的数据:

    

图中我们可以看到,订阅端也只是运行了usp_updateTestTb这个存储过程,并不会传递三条修改的记录过来,如果这个sp更新的数据很大,这样将大大减少同步链传递的数据量(如果我们更改的记录是一千万,传递的也就一条命令),数据的更新只相当于本地库的更新,对同步链没有影响;同时,基于对系统影响的考虑,我们把方法二和方法三两中方法结合起来运用,能收到很不错的效果。




转自 https://blog.csdn.net/kk185800961/article/details/38615273

标签:订阅,同步,TestTb,ustate,--,SqlServer,更新,延时
From: https://www.cnblogs.com/binli33/p/17799531.html

相关文章

  • 生产者消费者模式下实现多batch延时推理
    生产者消费者模式下实现多batch延时推理需求分析在实际推理过程中为了实现较高的吞吐量和较高的资源利用率,往往会使用多线程来收集多次请求,并组合形成多batch下的模型推理,一种常见的实现便是生产者和消费者模式,其需求如下:生产者收集提交的请求,消费者对请求进行消费,并将结果返......
  • 2023-10-21:用go语言,一共有三个服务A、B、C,网络延时分别为a、b、c 并且一定有:1 <= a <= b
    2023-10-21:用go语言,一共有三个服务A、B、C,网络延时分别为a、b、c并且一定有:1<=a<=b<=c<=10^9但是具体的延时数字丢失了,只有单次调用的时间一次调用不可能重复使用相同的服务,一次调用可能使用了三个服务中的某1个、某2个或者全部3个服务比如一个调用的时间,T=100100的延时......
  • 数据库数据恢复—误操作导致SqlServer数据库所在NTFS分区损坏的数据恢复案例
    SqlServer数据库数据恢复环境:一台服务器,windows操作系统+NTFS文件系统,运行了12个sqlserver数据库。SqlServer数据库故障:根据用户描述,故障情况是工作人员误操作导致服务器硬盘上sqlserver数据库所在分区损坏。经过北亚企安数据恢复工程师对故障服务器硬盘的初步检测,确认sqlserver......
  • java陷阱之关于数据同步
    需求需要查询设备列表。使用redissearch,需要从cannal->kafka->redis问题保证数据有序性和一致性(运维那边不能根据设备id进行分区,到时消息消费时面临消费的有序性问题)采用的是不使用binlog日志修改信息,采用通过id在数据库实时查一次。但是因为有些字段高频修改导致同步的时......
  • Net 高级调试之三:类型元数据介绍(同步块表、类型句柄、方法描述符等)
    一、简介今天是《Net高级调试》的第三篇文章,压力还是不小的。上一篇文章,我们浅浅的谈了谈CLR和Windows加载器是如何加载Net程序集的,如何找到程序的入口点的,有了前面的基础,我们今天看一点更详细的东西。既然Windows操作系统已经加载了CLR,初始化了应用程序域,加载......
  • SqlServer实现分页查询
    SqlServer实现分页查询1.利用max(主键)--分页查询公式-利用max(主键)selecttop@pageSize*from表名where主键>=(selectmax(主键)from(selecttop((@pageIndex-1)*@pageSize+1)主键from表名orderby主键asc)temp_max_ids)orderby主键;2.利用row_number关键字......
  • 怎样实现可靠的数据调度同步,数据同步方案看一下!
    随着企业规模不断扩大,分支机构越来越多,跨区域跨国的集团越来越多,越来越多的企业要求内部各种业务数据在服务器、数据中心甚至云上,能够进行实时的调度和同步,从而需要部署一套数据同步方案,实现服务器与服务器之间的文件数据同步。但在实际应用中存在诸多问题,主要表现在:大部分同步......
  • 学习笔记7——并发编程与线程同步
    学习笔记7——并发编程与线程同步本文将深入探讨并发编程的概念,介绍了并行计算的重要性,比较了顺序算法与并行算法,解释了线程的原理和相对于进程的优势,并通过示例介绍了在Pthread中进行线程操作。我们还将讨论线程同步工具,如互斥量、信号量和屏障,以及如何避免并发程序中的死锁问题......
  • [Java]Java初学之多线程03--同步与锁
    Intro本篇文章主要关于多线程"同步"以及"锁"的相关内容~正文同步(Synchronize)概念“同步”是基于“并发”的需求而出现的所谓并发,就是同一个对象被多个线程同时操作,比如两个人同时从同一个账户取钱,再比如春运抢票。多个线程同时使用一个资源,必然会造成混乱。想象一下从前......
  • 09-同步
    09-同步一、背景到目前为止多道程序设计(multi-programming):现代操作系统的重要特性并行很有用(为什么?)多个并发实体CPU(s)I/O用户进程/线程:操作系统抽象出来用于支持多道程序设计CPU调度:实现多道程序设计的机制调度算法-不同的策略接下来协同多道程序设计和并发问题......