并行运行存储过程

use*_*569 9 sql-server stored-procedures parallelism sql-server-2014

我希望尝试使用不同的参数但同时多次运行相同的存储过程。

我正在使用 SQL 2014

这样做的原因是该过程需要大约 7 个小时才能完成。它实际上多次执行相同的过程。因此,例如它可能会为每个分支构建一个新的数据库和表。

我想要做的是分解存储过程,以便我可以在每个分支中运行,然后并行运行每个查询。我已经通过在单独的查询窗口中运行它进行了测试,它的运行速度提高了近 80%。

谁能给我一份关于并行运行查询的傻瓜指南?

Bra*_*adC 10

有一次,我在 StackOverflow 上回答了这个问题,但在 DBA.SE 上也有这些信息,修订和更新似乎很有用。

只是为了完全明确:TSQL确实(本身)具有异步启动其他TSQL操作的能力

这并不意味着您仍然没有很多选择(其中一些在其他答案中提到):

  • SQL 代理作业:创建多个 SQL 作业,并安排它们在所需的时间运行,或者使用sp_start_job. 如果您需要以编程方式监控它们的进度,只需确保每个作业都更新了一个自定义的 JOB_PROGRESS 表(或者您可以检查它们是否已经完成了使用Gregory A. Larsen这篇优秀文章中xp_sqlagent_enum_jobs所述的未记录功能)。您必须创建尽可能多的独立作业,以运行并行进程,即使它们使用不同的参数运行相同的存储过程。
  • SSIS 包:使用简单的分支任务流创建 SSIS 包。SSIS 将在单独的 spid 中启动这些任务,SQL 将并行执行这些任务。
  • 自定义应用程序:使用您选择的语言(C#、Powershell 等),使用该语言提供的异步方法编写一个简单的自定义应用程序。在每个应用程序线程上调用 SQL 存储过程。
  • OLE 自动化:在 SQL 中,使用sp_oacreatesp_oamethod启动一个新进程调用彼此存储过程,如本文所述,也是 Gregory A. Larsen。
  • Service Broker:研究如何使用Service Broker这是本文中异步执行的一个很好的例子
  • CLR并行执行:使用CLR命令Parallel_AddSqlParallel_Execute在如所描述的本文由Alan卡普兰(SQL2005 +只)。
  • 计划的 Windows 任务:为了完整性而列出,但我不喜欢此选项。

如果是我,我可能会在更简单的场景中使用多个 SQL 代理作业,在更复杂的场景中使用 SSIS 包。

在您的情况下,除非您尝试启动 200 个单独的线程,否则多个计划的代理作业听起来像是一个简单且易于管理的选择。

最后一条评论:SQL 已经尝试尽可能并行化单个操作*。这意味着同时运行 2 个任务而不是依次运行并不能保证它会更快完成。仔细测试,看看它是否真的改善了什么。

我们有一个开发人员创建了一个 DTS 包来同时运行 8 个任务。不幸的是,它只是一个 4-CPU 服务器 :)

*假设默认设置。这可以通过更改服务器的最大并行度或关联掩码,或使用 MAXDOP 查询提示来修改。


小智 0

由于这让我想起了我在工作中遇到的一个用例,我将介绍一下我们如何解决它:

首先,正如已经说过的,我认为 SQL 中不存在类似 Unix“nohup”的东西:一个连接 = 一个语句,以及所有相关内容(锁定、提交、错误...)

我们找到了使用免费 ETL Talend 的方法,将其配置为连接到数据库,并运行一堆包装存储过程的并行作业。

我们Iterate根据需要多次使用该组件和循环,从而启用该multi-threads选项。