标签: batch-processing

如何避免表锁升级?

我有一项任务要更新生产表中的 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

6
推荐指数
1
解决办法
602
查看次数

从表中分块删除

我想清理我的一张有 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)

mysql delete batch-processing

2
推荐指数
1
解决办法
2万
查看次数