问题描述
数据表有几千万数据,需要就其中约百万数据进行更新,不能锁表。因此采用游标进行更新。
解决方案
-- 声明变量用以存储游标获得的数据
DECLARE @Id INT;
-- 声明游标
DECLARE IdCursor CURSOR FOR(SELECT id FROM my_table WHERE state = -2 ) FOR UPDATE OF state;
-- 打开游标
OPEN IdCursor;
-- 移动游标,加载数据
FETCH NEXT FROM IdCursor
INTO @Id;
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE my_table SET state=-1 WHERE id = @Id;
-- 移动游标到下一条数据
FETCH NEXT FROM IdCursor
INTO @Id;
END;
CLOSE IdCursor;
DEALLOCATE IdCursor;
本文介绍如何在千万级数据表中使用游标高效更新约百万条状态为-2的记录,避免锁定整个表,实现并发处理。
402

被折叠的 条评论
为什么被折叠?



