我有一部分代码,在简化后,看起来像这样:
select @mainlooptableid = min(uid)
from queueofids with (nolock)
while (@mainlooptableid is not null)
begin
-- A large block of code that does several things depending on the nature of @mainlooptableid
-- .
-- .
-- .
-- End of this blocks main logic
delete from queueofids where uid = @mainlooptableid
select @mainlooptableid = min(uid)
from queueofids with (nolock)
end
我希望能够在queueofids表中的所有uid中并行运行while循环内部的代码段。基于循环内部发生的事情我可以保证如果它们要同时运行,它们将不以任何方式相互干扰,所以从逻辑上看它似乎非常安全像这样跑。真正的问题是,是否有办法让sql为其中的所有值运行一部分代码?
注意:我确实考虑过生成一个临时表,其中包含一系列以字符串形式存储的已创建的sql语句,除了@mainlooptableid值之外,每个语句都是相同的。但即使我已经准备好执行这个sql语句表,我也不确定如何让所有这些语句同时执行。
答案 0 :(得分:1)
我想不出在单个SQL脚本中执行此操作的方法;脚本是程序性的。如果你想探索这个想法,你可能需要涉及某种形式的多线程应用程序来处理循环方面,并打开一个线程来交出当前脚本的并行化部分。并非不可能,但它确实带来了一些复杂性。
如果你想在SQL中完成所有这些,那么你将不得不重写代码来消除循环。如上面的注释所述,SQL Server是基于集合的,这意味着它通过对一个集合“一次性”完成工作来处理一定数量的并行化。
答案 1 :(得分:0)
不,没有办法让同一脚本中的SQL语句并行运行。
最接近它的是尝试创建一个基于集合的方法来处理它们,而不是在循环中运行它们。
答案 2 :(得分:0)
请注意,如果线程竞争相同的资源,并行运行不一定会更快。
我不认为SQL会并行化语句。但SQL将在单个语句中并行执行。
大多数编程框架都是并行的。例如在.NET中,这很简单。创建一个传递@mainlooptableid的过程,并将其并行调用。