我们有一个每晚运行的存储过程,反过来启动了许多其他程序.其中一些程序在逻辑上可以与其他一些程序并行运行.
如何向SQL Server指示过程是应该并行还是串行运行 - 即:异步启动还是阻塞?
并行运行它们的含义是什么,请记住,我已经确定进程不会竞争表访问或锁定 - 只是总磁盘io和内存.在大多数情况下,他们甚至不使用相同的表格.
如果其中一些程序是相同的程序,只是使用不同的参数,这是否重要?
如果我异步启动一对或多个程序,SQL Server中是否有一个好的系统然后等待它们两个完成,或者我是否需要让它们每个都在某处设置一个标志并定期检查和轮询标志WAITFOR DELAY
?
目前我们还在使用SQL Server 2000.
作为旁注,这很重要,因为主程序是响应从大型机系统完成从服务器到服务器的数据而启动的.大型机转储每晚大约需要2个小时,我们无法控制它.因此,我们一直在努力寻找缩短处理时间的方法.
我最近不得不对此进行研究,因此发现这个老问题正在寻求更完整的答案.完全明确:TSQL(本身)不能异步启动其他TSQL操作.
这并不意味着你仍然没有很多选择(其中一些在其他答案中提到):
自定义应用程序:使用异步方法以您选择的语言编写简单的自定义应用程序.在每个应用程序线程上调用SQL存储过程.
SQL代理作业:创建多个SQL作业,并使用proc从异步启动它们sp_start_job
.你可以检查一下他们是否已经完成了使用Gregory A. Larsen 这篇优秀文章中xp_sqlagent_enum_jobs
描述的无证功能 .(或者有自己更新自己的JOB_PROGRESS表作为克里斯暗示的工作.)你会从字面上来为你创建预期运行的每个并行处理单独的作业,即使它们运行的是具有不同的参数相同的存储过程.
OLE自动化:使用sp_oacreate
和sp_oamethod
启动一个调用其他存储过程的新进程,如本文所述,Gregory A. Larsen也是如此.
DTS包:使用简单的分支任务流创建DTS或SSIS包.DTS将以单独的spid启动任务.
Service Broker:如果您使用的是SQL2005 +,请查看使用Service Broker
CLR并行执行:使用CLR命令Parallel_AddSql
,Parallel_Execute
如Alan Kaplan 撰写的本文所述(仅限SQL2005 +).
计划的Windows任务:列出完整性,但我不是这个选项的粉丝.
我对Service Broker或CLR没有太多经验,所以我无法对这些选项发表评论.如果是我,我可能会在更简单的场景中使用多个作业,而在更复杂的场景中使用DTS/SSIS包.
最后一条评论:SQL已经尝试在可以*的情况下并行化各个操作.这意味着同时运行2个任务而不是相互运行并不能保证它会更快完成.仔细测试,看它是否真的改善了.
我们有一个开发人员创建了一个DTS包,可以同时运行8个任务.不幸的是,它只是一个4 CPU服务器:)
*假设默认设置.这可以通过更改服务器的最大并行度或亲和性掩码,或使用MAXDOP查询提示进行修改.