更新SQL SQL Server
我需要更改表中列的值,因此我需要执行以下操作:更新SQL SQL Server,sql,sql-server,Sql,Sql Server,我需要更改表中列的值,因此我需要执行以下操作: update members set frequence = 1 where frequence <> 1 我有700万行受到影响,我需要批量更新100000行,然后休眠2分钟,以便复制到其他数据库 请问我怎么做 Regrads这是一种比较常见的方法,尽管通常用于: DECLARE @hasRows BIT = 1 WHILE @hasRows = 1 BEGIN UPDATE TOP (100000) members
update members
set frequence = 1
where frequence <> 1
我有700万行受到影响,我需要批量更新100000行,然后休眠2分钟,以便复制到其他数据库
请问我怎么做
Regrads这是一种比较常见的方法,尽管通常用于:
DECLARE @hasRows BIT = 1
WHILE @hasRows = 1
BEGIN
UPDATE TOP (100000) members
SET frequence=1
WHERE frequence<>1
IF @@ROWCOUNT = 0 SET @hasRows = 0
WAITFOR DELAY '00:02'
END
如果需要按顺序执行,请按如下方式执行:
SET NOCOUNT ON;
DECLARE @r INT;
SET @r = 1;
WHILE @r > 0
BEGIN
BEGIN TRANSACTION;
;with CTE as (
select top 100000 *
from members
where frequence <> 1
order by member_id
)
update CTE
set frequence = 1
SET @r = @@ROWCOUNT;
COMMIT TRANSACTION;
WAITFOR DELAY '00:02'
-- To limit log activity:
-- CHECKPOINT; -- if simple
-- BACKUP LOG ... -- if full
END
我想你应该看看Micheal J.Schwartz关于这个主题的文章:
如果您不使用memberId进行筛选,您可能会在扫描过程结束时扫描整个表,因为频率不是很有选择性。您是否有任何列来确定顺序?是的,我有一个memberId,因为您一次更新超过5000行,由于SQL Server执行锁升级以处理大量锁,您将产生表级独占锁,这意味着在更新事务运行时,其他读取器甚至无法从该表中读取…字体结尾是否需要逻辑?您使用的是哪种编程语言?如果@ROWCOUNT=0 SET@hasRows=0,则应为为什么添加事务?米哈伊洛巴诺夫:不,在这种情况下不是。它之所以存在,主要是因为我抄袭的东西。IMX,若你们计划使用它来限制日志使用,那个么这是必要的,否则检查点可能无法正常工作。哈!Micheal J.Schwartz我爱死它了!谢谢你的插拔
SET NOCOUNT ON;
DECLARE @r INT;
SET @r = 1;
WHILE @r > 0
BEGIN
BEGIN TRANSACTION;
;with CTE as (
select top 100000 *
from members
where frequence <> 1
order by member_id
)
update CTE
set frequence = 1
SET @r = @@ROWCOUNT;
COMMIT TRANSACTION;
WAITFOR DELAY '00:02'
-- To limit log activity:
-- CHECKPOINT; -- if simple
-- BACKUP LOG ... -- if full
END