我同意 John 的观点,即 SSIS 为此类场景提供了大量内置智能,并且可能是您投入时间的最佳选择。
作为记录,您可以通过对数据进行分区来解决此类问题。我不是在谈论物理存储分区(即添加表分区),而是逻辑处理分区。你分割你的200万。N 个分区中的记录,基于您可以在数据访问级别利用的任何标准,例如。一个索引列,然后分配 N 个处理器,每个处理器在自己的分区上开始搅动。这个想法是不要让处理器在尝试访问相同的行时重叠。“处理器”可以是线程,或者更好的是 ThreadPool 将使用异步数据库访问方法的工作项排队。
最大的问题是很多时候您没有合适的分区键。在这种情况下,您可以像这样进行临时分区:
with cte as (
select top (@batchSize) *
from myTable with (rowlock, updlock, readpast)
where <record is ready to be processed>)
update cte
set <mark record processing>
output inserted.*
诀窍是选择中使用的锁定提示:通过强制和上锁,记录被锁定以供当前处理器处理。通过添加 readpast 提示,每个处理器将跳过已被其他处理器锁定的记录。这样,无论处理是什么,每个处理器都会获得自己的 @batchSize 批记录来处理。
重要的是要理解所有这些注释都适用于涉及数据库之外的某些内容的处理,例如进行 Web 服务调用、打印纸条或任何类似的东西。如果处理全部在数据库中,那么您应该将其表达为单个 T-SQL 更新,并让查询优化器使用它认为合适的并行查询。