update log set CheckTime=CreateTime where CheckTime is null
数据 60万条左右,一执行就很难取消,执行时间很长 ,而且前台系统整个都挂了 数据库连接就超时了 ,请问 怎么办
6 个解决方案
#1
1、这个张表是不是有触发发器。
2、要更新的记录是否已被其他会话锁住。
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、要更新的记录是否已被其他会话锁住。
#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