gpt4 book ai didi

sql-server - 在生产环境中运行更新语句时行锁定

转载 作者:行者123 更新时间:2023-12-03 12:50:25 24 4
gpt4 key购买 nike

我想知道下面的正确解决方案是什么。

我在T-SQL中有一个UPDATE语句,该语句需要作为日常任务运行。该过程将更新一张表中的一位列。受影响的行数约为30,000。

T-SQL的伪版本

UPDATE TABLE_NAME
SET BIT_FIELD = [dbo].[FUNCTION](TABLE_NAME.ID)
WHERE -- THIS ISN'T RELEVANT


确定是或否的函数基本上会运行一些检查并在其他3个表周围命中。当前,该过程大约需要30分钟才能在我们的开发环境中运行和更新30,000行。我期望产量能翻一番。

我遇到的问题是间歇性 TABLE_NAME表锁定。如果我以1000的批次运行它,似乎还可以,但是如果我增加它,它似乎可以正常运行,但是最终表被锁定了。唯一的解决方案是取消查询,这将导致没有行被更新。

请注意,该过程未包装在TRANSACTION中。

如果我在单独的 UPDATE语句中运行每个更新,是否可以解决此问题?在实时环境中更新大量记录时,什么是好的解决方案?

任何帮助将非常感激。

谢谢!

最佳答案

在您的情况下,SQL Server Optimizer可能已确定需要使用表锁来执行表的更新。您应该对查询执行重做,以使该表锁定不会发生或对用户的影响较小。因此,从实际的角度来看,这意味着:(a)加快查询速度,(b)确保该表不会锁定。
我个人将考虑以下方面:
1.在表上创建聚簇索引和非聚簇索引,以提高查询性能。
2.看看是否有可能不使用函数,而是使用联接,它们通常要快得多。
3.将更新分为多个部分,并分别执行这些部分。您可能在'where'子句中有一个'or'分支,这是一个很好的拆分点,但是您也可以考虑创建一个游标来遍历表并一次执行一次更新。

关于sql-server - 在生产环境中运行更新语句时行锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7753287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com