我们需要进行另一次大规模更新,但由于存在严重的锁定问题风险,因此需要停机维护。基本上,我们希望在工作时间内更新数亿行数据。
现在,将更新分为可管理的小批量,例如每批不超过5000个可以有所帮助,但我在想是否可行创建一个模板,仅读取和锁定可用的行,更新它们,然后转移到下一批?这种方法的想法是,在最小化风险的情况下,我们可以使用此方法修补约95%的数据,然后在慢期间将剩余的数据集全部更新一次并注意锁定。
是的,我知道这听起来很奇怪,但请耐心听我说完。如何实现这一点?
我在想类似以下的东西:
现在,将更新分为可管理的小批量,例如每批不超过5000个可以有所帮助,但我在想是否可行创建一个模板,仅读取和锁定可用的行,更新它们,然后转移到下一批?这种方法的想法是,在最小化风险的情况下,我们可以使用此方法修补约95%的数据,然后在慢期间将剩余的数据集全部更新一次并注意锁定。
是的,我知道这听起来很奇怪,但请耐心听我说完。如何实现这一点?
我在想类似以下的东西:
WHILE @@ROWCOUNT > 0
BEGIN
UPDATE TOP (5000) T
SET T.VALUE = 'ASD'
FROM MYTABLE T
JOIN (SELECT TOP 5000 S.ID
FROM MYTABLE S WITH (READPAST, UPDLOCK)
WHERE X = Y AND Z = W etc...) SRC
ON SRC.ID = T.ID
END
有什么想法吗?基本上,我不希望这个查询被其他潜在的长时间运行的事务卡住,或者反过来对其他人造成相同的影响。所以我在这里需要一个脚本,它将跳过锁定行,在最小风险涉及锁定或死锁的情况下更新它能够更新的内容,因此在正常运行期间的一小时左右可以安全地运行。