我想知道下面的正确解决方案是什么。
我在T-SQL中有一个UPDATE
语句,需要作为日常任务运行。该过程将更新一个表中的一个位列。受影响的行数约为30,000。
T-SQL的伪版本
UPDATE TABLE_NAME
SET BIT_FIELD = [dbo].[FUNCTION](TABLE_NAME.ID)
WHERE -- THIS ISN'T RELEVANT
确定true或false的函数基本上会运行一些检查并在其他3个表中进行命中。目前,在我们的开发环境中,该过程大约需要30分钟才能运行并更新30,000行。我原以为这会使产量增加一倍。
我遇到的问题是间歇TABLE_NAME
表被锁定。如果我以1000的批量运行它似乎没问题,但如果我增加它似乎运行正常但最终表锁定。唯一的解决方案是取消查询,导致没有更新行。
请注意,该程序未包含在TRANSACTION中。
如果我在单独的UPDATE
语句中运行每个更新,这会解决它吗?在实时环境中更新大量记录时,什么是一个很好的解决方案?
非常感谢任何帮助。
谢谢!
答案 0 :(得分:1)
在您的情况下,SQL Server Optimizer可能已确定需要表锁来执行表的更新。您应该对查询执行返工,以便不会发生此表锁定或对用户产生较小的影响。因此,实际上这意味着:(a)加快查询速度;(b)确保表格不会锁定
我个人会考虑以下几点:
1.在表上创建聚簇索引和非聚簇索引,以提高查询性能
2.看看是否可以不使用函数,而是使用联接,它们通常要快得多
3.分解多个部分的更新并分别执行这些部分。您可能在'where'子句中有一个'或'声明,这是一个很好的分裂点,但您也可以考虑创建一个游标来循环遍历表并一次在一个记录上执行更新。