【发布时间】:2018-10-14 03:07:31
【问题描述】:
我有一个非并行数据查询存储过程调用。这是查询。
SELECT TOP(1000) a.[tableA_id] AS [id],a.[tableA_name],a.[tableA_modified]
FROM tableA a
WHERE a.[tableA_modified] = 1
AND a.tableA_id NOT IN (
SELECT tableA_id_foreign
FROM tableB_id b
)
这是c#代码的样子。
for
{
UpdateBatch(SpCall());
}
这个 SP 调用发生在批量。批处理成功完成后,该批处理的“tableA_modified”列设置为 0。所以在下一次调用中,会返回新批次。
但现在我想在 parallel for 中执行此 SP 调用。 现在我想这样实现它。
parallelfor
{
UpdateBatch(SpCall());
}
但我不能使用“TOP”,因为 SP 调用并行发生(因此 tableA_modified 未设置为前 1000 行中的 0)。而且我也不能获取整个结果(不将第一组限制为 1000),因为这会产生超时。有没有办法解决这个问题。
【问题讨论】:
-
您可以尝试在 SQL 中使用页面/偏移量,但请确保您可以订购一些安全的东西。 dofactory.com/sql/order-by-offset-fetch 并将页码传递给存储过程。您仍然需要弄清楚每次调用是针对哪个页面的。
-
您需要计算总行数,然后在 c# 中创建与批次相关的范围,然后将范围传递到 parallel.foreach。然后有一个 SP,它将返回一系列条目,
order by,id column和where,范围为start > y和x < end。这意味着选择查询仍将保持高性能,并且永远不会选择相同的行。理想情况下,您希望向表中添加一列并将其命名为批处理,并预先分配一个 batch_id,并据此进行处理。
标签: c# sql-server task-parallel-library parallel-foreach