我有一项任务要更新生产表中的 500 万行,而无需长时间锁定整个表
所以,我使用了多次帮助我的方法 - 一次更新前 (N) 行,块之间的间隔为 1-N 秒
这次从一次更新前 (1000) 行开始,监视扩展事件会话中的lock_escalation事件
lock_escalation在每次更新操作期间出现,所以我开始将每个块1000 -> 500 -> 200 -> 100 -> 50行的行数降低到 1
之前(不是使用这个表,并且对于删除操作 - 不是更新),将行数降低到 200 或 100,有助于摆脱lock_escalation事件
但是这一次,即使每 1 次更新操作有 1 行,表lock_escalation仍然显示。每次更新操作的持续时间大致相同,无论是一次 1 行还是 1000 行
在我的情况下如何摆脱表锁升级?
@@TRANCOUNT 为零
扩展事件:
代码:
set nocount on
declare
@ChunkSize int = 1000, -- count rows to remove in 1 chunk
@TimeBetweenChunks char(8) = '00:00:01', -- interval between chunks
@Start datetime,
@End …Run Code Online (Sandbox Code Playgroud) sql-server extended-events lock-escalation sql-server-2017 batch-processing
我想清理我的一张有 400 万的表。所以我准备这个查询来清理它。但它抛出了一个错误,有人可以帮我解决这个问题吗?
DELIMITER $$
DROP PROCEDURE IF EXISTS archive_table $$
create procedure archive_table ()
set @min=(select min(dob) from test
where dob < DATE_SUB(CURDATE(), INTERVAL 30 day));
while @min is not null
begin
delete from test where dob = @min;
commit ;
select min(dob) from test
where dob > @min
and dob < DATE_SUB(CURDATE(), INTERVAL 30 day) );
END WHILE;
END$$
Run Code Online (Sandbox Code Playgroud)
错误:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your …Run Code Online (Sandbox Code Playgroud)