【问题标题】:Updating columns in same table with parallel running Stored Procedures使用并行运行的存储过程更新同一表中的列
【发布时间】:2017-10-03 09:50:29
【问题描述】:

我有一张桌子看起来像:

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'

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

有更好的解决方法吗?

提前致谢
斯蒂芬

【问题讨论】:

  • 我不明白它是如何工作的:EXEC dbo.fill_Attr1 @Customer = 'Smith' 负责处理 Smith 的 attr1,仅此而已。所以更新表需要 70*3,000,000 或 210,000,000 次调用?
  • 您能否修改逻辑,以便只使用一个过程并一次性对所有列应用更新?
  • @LeeEverest:不,每个属性都有一个存储过程。所以总共有70个SP
  • @RigertaDemiri:可能,但不需要。整个逻辑(很多)将在一个 SP 中。所以它会再次串行运行
  • @LeeEverest:StoredProcedure 正在更新一列。因此在我上面的示例中,存储过程将在存储过程中的一个更新语句中更新 Customer = 'Smith' 的所有记录。

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


【解决方案1】:

我会重写 proc 以更新 整个列,而不仅仅是一个用户/个人/客户“史密斯”。

【讨论】:

  • 这是评论,不是解决方案。如上面评论中所述,存储过程已经在更新客户的所有记录。不仅仅是一条记录。
  • 我不确定你是否关注我 - 你说的是客户的所有记录。我说的是列中所有客户的所有记录。我们在同一页上吗?
  • 我明白了。但这是不可能的。如果估计属性所需的数据已经为一个客户准备好了,那么它可能还没有为另一个客户准备好。因为它们来自不同的预系统。它们不是同时交付的。这就是为什么存储过程有参数客户。所以:客户 A 准备好了,70 个 SP 的链已经开始了。也许几分钟后客户 B 的数据准备好了,现在“他的”70 个 SP 链将开始。如果多个客户的这些 SP 同时运行,则会产生死锁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 2018-06-07
  • 1970-01-01
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多