如何并行运行SQL Server存储过程?

8
我想要做类似以下的事情:
exec sproc1 and sproc2 at the same time
when they are both finished exec sproc3

我可以在dts中完成这个任务。 有没有一种方法可以使用Transact SQL来完成? 或者有没有一种方法可以使用批处理脚本(例如vbs或powershell)来完成?


如果您能说明原因,而不仅仅是因为这是一个有趣的问题,那么回答这个问题可能会更容易。然后我们可以解决目的而不是技术。 - dkretz
将数据加载到 SQL Server 数据仓库中涉及执行许多 SQL 语句。能够并行执行语句将加快此过程。您可以使用 DTS 工具来实现这一点。我是那些尽可能使用代码的人之一。 - cindi
4个回答

5
您可以创建一个CLR存储过程(使用C#),该存储过程将调用前两个线程,并阻塞,直到两个线程都完成...然后运行第三个线程。
如果您的情况允许使用CLR sprocs,则我将编辑此答案以提供更多详细信息。

谢谢Timothy,但我想我只是在寻找一个高级解决方案:额外的几行Transact SQL或批处理脚本代码。我只是想知道是否有一个简单的替代DTS - Cindi - cindi
Thread.Join被主机保护属性阻止。这个解决方案可以运行,但不可靠。另外请注意,SQL Server可以在任何时候挂起你的线程。 - Filip De Vos

4

sp _ start _ job

我目前正在进行类似的事情,避免使用SSIS或外部shell的唯一方法是手动将我的加载程序拆分为“线程”,然后触发单个主sqlagent作业,该作业依次执行与我拥有的线程数相同的sp _ start _ job。从那时起,它们都将自主运行。

虽然不完全符合我们的要求,但结果相同。如果你测试子作业的作业状态,也可以实现对存储过程3的有条件启动。

如果不能同时使用所有8个核心,那还有什么意义呢?


这太棒了!当每个线程完成时,我可以检查其他所有作业,因此最后一个完成的线程可以启动下一个作业。 - cindi

1

你是否绝对需要同时执行这两个存储过程?

如果在单个存储过程中使用简单的CRUD语句,我发现SQL S.非常擅长确定哪些语句可以并行运行,并且确实这样做了。如果两个SP从T-SQL语句中顺序调用,我从未见过SQL S.并行运行2个SP,甚至不知道它是否可能。

那么,DTS真的会并行执行它们吗?可能它只是按顺序依次执行它们,然后在最后一个成功完成后调用第三个SP。

如果它真的并行运行它们,那么你应该坚持使用DTS,但是我想知道如果我有一个DTS包并行调用10个重型SPs时它会怎么做...我可能需要进行一些测试来自己学习:D


将单个语句拆分为并行线程是另一个话题。DTS可以并行运行单独的语句,并且提供了大量控制此操作的方法。然而,有时代码比工具更可取,这就是提出该问题的原因。 - cindi

0

您可以使用SSIS。这样做的好处是,包可以存储在SQL Server中,并且可以轻松地在那里进行调度。

从PowerShell或几乎任何外部脚本语言,您都可以使用SQL命令行osql或sqlcmd。这种技术也可以通过使用xp_cmdshell来外壳化并在SQL Server上进行调度。


SSIS = DTS,问题是如何避免使用DTS显然你可以从脚本语言中运行SQL,问题是如何并行运行SQL语句。 - cindi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接