Sql 按顺序或并行启动存储过程

Sql 按顺序或并行启动存储过程,sql,sql-server,tsql,sql-server-2000,parallel-processing,Sql,Sql Server,Tsql,Sql Server 2000,Parallel Processing,我们有一个每晚运行的存储过程,它反过来启动许多其他过程。其中一些过程在逻辑上可以与其他一些过程并行运行 我如何向SQL Server指示一个过程是并行运行还是串行运行-即:异步启动还是阻塞启动 并行运行它们会有什么影响,请记住,我已经确定,这些进程不会竞争表访问或锁,只会竞争总的磁盘io和内存。在大多数情况下,他们甚至不使用相同的表格 如果其中一些程序是相同的程序,只是参数不同,这有关系吗 如果我异步启动一对或多个过程,SQL Server中是否有一个好的系统来等待它们完成,或者我是否需要让它

我们有一个每晚运行的存储过程,它反过来启动许多其他过程。其中一些过程在逻辑上可以与其他一些过程并行运行

  • 我如何向SQL Server指示一个过程是并行运行还是串行运行-即:异步启动还是阻塞启动
  • 并行运行它们会有什么影响,请记住,我已经确定,这些进程不会竞争表访问或锁,只会竞争总的磁盘io和内存。在大多数情况下,他们甚至不使用相同的表格
  • 如果其中一些程序是相同的程序,只是参数不同,这有关系吗
  • 如果我异步启动一对或多个过程,SQL Server中是否有一个好的系统来等待它们完成,或者我是否需要让它们中的每一个都在某个地方设置一个标志,并使用
    waitfordelay
    定期检查和轮询该标志
目前,我们仍然使用SQL Server 2000


作为旁注,这很重要,因为主过程是在完成从大型机系统到服务器的数据转储后启动的。大型机转储每晚只需2小时左右,我们无法控制它。因此,我们一直在努力寻找减少处理时间的方法。

创建两个SQL Server代理作业,每个作业都运行一个特定的过程

然后从主进程内部启动作业

我能想到的唯一等待方法是,如果你有一个状态表,每个进程完成后都会更新

然后,另一项工作可以对该表进行投票,以确定其全部完成情况,并启动最终程序。或者,您可以在此表上设置触发器

内存含义完全取决于您的环境

更新: 如果您有权访问任务系统。。然后你可以采取同样的方法。只需让windows执行多个任务,每个任务负责一个进程。然后,在所有任务完成后,使用状态表上的触发器启动某些操作

更新2:
此外,如果你愿意创建一个新的应用程序,你可以将所有逻辑都放在一个exe中…

你确实需要将过夜存储过程移动到作业中。SQL Server作业控制将允许您执行您要求的所有计划。

您可能希望研究使用DTS(可以作为作业从SQL代理运行)。它将允许您很好地控制哪些存储过程需要等待其他存储过程完成,以及哪些存储过程可以并行运行。如果需要,您还可以从自己的调度软件以EXE的形式运行DTS包


注意:您需要创建连接对象的多个副本,以允许调用并行运行。使用同一连接对象的两个调用仍然会相互阻塞,即使您没有明确地放入依赖项。

我最近不得不对此进行研究,因此发现了一个老问题,该问题需要一个更完整的答案。简单地说:TSQL本身不具备异步启动其他TSQL操作的能力

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

  • 自定义应用程序:使用异步方法,用您选择的语言编写一个简单的自定义应用程序。在每个应用程序线程上调用SQL存储过程
  • SQL代理作业:创建多个SQL作业,并使用
    sp\u start\u job
    从进程异步启动它们。您可以检查他们是否已经使用Gregory A.Larsen在中描述的未记录函数
    xp\u sqlagent\u enum\u jobs
    。(或者按照Chris的建议,让作业本身更新您自己的作业进度表。)您必须为预期运行的每个并行进程创建单独的作业,即使它们运行的是具有不同参数的相同存储过程
  • OLE自动化:使用
    sp_oacreate
    sp_oamethod
    启动一个新进程,调用另一个存储过程,如中所述,也是由Gregory a.Larsen所述
  • DTS包:使用简单的分支任务流创建DTS或SSIS包。DTS将在单个SPID中启动任务
  • ServiceBroker:如果您使用的是SQL2005+,请考虑使用
  • CLR并行执行:使用艾伦·卡普兰(仅限SQL2005+)在中描述的CLR命令
    Parallel\u AddSql
    Parallel\u Execute
  • 计划的Windows任务:为了完整性而列出,但我不喜欢这个选项
我在ServiceBroker或CLR方面没有太多经验,因此我无法对这些选项发表评论。如果是我,我可能会在更简单的场景中使用多个作业,在更复杂的场景中使用DTS/SSIS包

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

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


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

听起来这是可行的,但这里不鼓励创建作业。甚至我在这里所说的主要过程也不是一个作业——它是通过一个独立于windows计划任务的程序运行的。exe的想法更吸引人,不过我还是想知道它是否