【发布时间】: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