批量更新更新时间很长,锁表,整个系统挂了

时间:2022-06-14 14:01:05

update  log   set CheckTime=CreateTime where CheckTime is null 
数据 60万条左右,一执行就很难取消,执行时间很长 ,而且前台系统整个都挂了 数据库连接就超时了 ,请问 怎么办 

6 个解决方案

#1


1、这个张表是不是有触发发器。
2、要更新的记录是否已被其他会话锁住。

#2


没有触发器,整个数据都没有触发器

#3


更新的记录都是历史数据,按理不会被使用

#4


建立一个copy表, 更新, 然后重命名。 这样就不会有问题。 

#5


大事务是万恶之源, 一次性更新、删除太多数据都可能引发系统崩溃, 特别是生产环境。
把代码改成下面的, 会好很多, 你可以试下。

-- 每次只处理 100 条,分批循环处理
SET ROWCOUNT 100;
WHILE EXISTS(SELECT 1 FROM [LOG] WHERE checkTime IS NULL)
BEGIN
update [log] set CheckTime=CreateTime where CheckTime is NULL; 
END
-- 改回原始值
SET ROWCOUNT 0;

#6


也可以这样 

WHILE EXISTS(SELECT 1 FROM [LOG] WHERE checkTime IS NULL)
BEGIN
    update top(100) [log] set CheckTime=CreateTime where CheckTime is NULL; 
END

#1


1、这个张表是不是有触发发器。
2、要更新的记录是否已被其他会话锁住。

#2


没有触发器,整个数据都没有触发器

#3


更新的记录都是历史数据,按理不会被使用

#4


建立一个copy表, 更新, 然后重命名。 这样就不会有问题。 

#5


大事务是万恶之源, 一次性更新、删除太多数据都可能引发系统崩溃, 特别是生产环境。
把代码改成下面的, 会好很多, 你可以试下。

-- 每次只处理 100 条,分批循环处理
SET ROWCOUNT 100;
WHILE EXISTS(SELECT 1 FROM [LOG] WHERE checkTime IS NULL)
BEGIN
update [log] set CheckTime=CreateTime where CheckTime is NULL; 
END
-- 改回原始值
SET ROWCOUNT 0;

#6


也可以这样 

WHILE EXISTS(SELECT 1 FROM [LOG] WHERE checkTime IS NULL)
BEGIN
    update top(100) [log] set CheckTime=CreateTime where CheckTime is NULL; 
END