使用并行运行的存储过程更新同一表中的列

时间:2017-10-03 09:50:30

标签: sql sql-server stored-procedures sql-server-2012

我的桌子看起来像是:

Key   Customer  Attr1   Attr2   Attr3   Attr4   Attr5   ...     Attr70
123   Smith     NULL    NULL    NULL    NULL    NULL    ...     NULL
456   Wesson    NULL    NULL    NULL    NULL    NULL    ...     NULL
....

此表有几(约3)百万行。
每个属性都有自己的存储过程,并带有计算逻辑来填充此列。

目前这些存储过程正在运行串行并且需要相当长的时间。他们的执行方式如下:EXEC dbo.fill_Attr1 @Customer = 'Smith'

我已经将这些存储过程并行运行(由作业调度工具启动),但遗憾的是偶尔发生DEADLOCKS

使所有(或至少几个)SP并行运行的最佳做法是什么?
我正在考虑添加WITH (NOLOCK) - 我读到这不是一个好习惯。
但是,由于这是在批处理过程中发生的,我可以保证在这些SP运行时没有其他进程会更改或插入数据。

使问题更清晰的其他信息。
目前这些SP正在运行如下序列:

EXEC dbo.fill_Attr1 @Customer = 'Smith'   
EXEC dbo.fill_Attr1 @Customer = 'Wesson'
EXEC dbo.fill_Attr2 @Customer = 'Smith'
EXEC dbo.fill_Attr2 @Customer = 'Wesson'
EXEC dbo.fill_Attr3 @Customer = 'Smith'
EXEC dbo.fill_Attr3 @Customer = 'Wesson'

每个存储过程始终更新一个客户的所有记录。
根据逻辑如何计算属性,这可以在单个更新中完成,或者 - 如果是更复杂的逻辑 - 在存储过程中的多个更新中。

更好的解决方法如何解决?

提前致谢
斯蒂芬

1 个答案:

答案 0 :(得分:0)

我重写了proc来更新整个列,而不仅仅是一个用户/个人/客户' Smith'。