你可以根据select语句的结果并行运行脚本的一部分吗?

时间:2016-01-07 13:53:12

标签: sql sql-server tsql

我有一部分代码,在简化后,看起来像这样:

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语句表,我也不确定如何让所有这些语句同时执行。

3 个答案:

答案 0 :(得分:1)

我想不出在单个SQL脚本中执行此操作的方法;脚本是程序性的。如果你想探索这个想法,你可能需要涉及某种形式的多线程应用程序来处理循环方面,并打开一个线程来交出当前脚本的并行化部分。并非不可能,但它确实带来了一些复杂性。

如果你想在SQL中完成所有这些,那么你将不得不重写代码来消除循环。如上面的注释所述,SQL Server是基于集合的,这意味着它通过对一个集合“一次性”完成工作来处理一定数量的并行化。

答案 1 :(得分:0)

不,没有办法让同一脚本中的SQL语句并行运行。

最接近它的是尝试创建一个基于集合的方法来处理它们,而不是在循环中运行它们。

答案 2 :(得分:0)

请注意,如果线程竞争相同的资源,并行运行不一定会更快。

我不认为SQL会并行化语句。但SQL将在单个语句中并行执行。

大多数编程框架都是并行的。例如在.NET中,这很简单。创建一个传递@mainlooptableid的过程,并将其并行调用。