我们有一个每晚运行的存储过程,进而启动许多其他过程。其中一些程序在逻辑上可以与其他一些程序并行运行。
- 我如何向 SQL Server 指示一个过程应该并行运行还是串行运行——即:异步启动还是阻塞运行?
- 并行运行它们会产生什么影响,请记住,我已经确定这些进程不会竞争表访问或锁 - 只是总磁盘 io 和内存。在大多数情况下,他们甚至不使用相同的桌子。
- 如果其中一些程序是same程序,只是参数不同?
- 如果我异步启动一对或过程,SQL Server 中是否有一个好的系统来等待它们两个完成,或者我是否需要让它们每个在某处设置一个标志,并使用定期检查和轮询标志
WAITFOR DELAY
?
目前我们仍然使用 SQL Server 2000。
附带说明一下,这很重要,因为主程序是响应从大型机系统将数据转储到服务器的完成而启动的。主机转储每晚大约需要 2 个小时,而且我们无法控制它。因此,我们不断尝试寻找减少处理时间的方法。
我最近不得不研究这个问题,所以发现了这个老问题,需要一个更完整的答案。只是为了完全明确:TSQL 确实not(通过它自己)能够异步启动其他 TSQL 操作.
这并不意味着您仍然没有很多选择(其中一些在其他答案中提到):
-
定制应用程序:使用异步方法以您选择的语言编写一个简单的自定义应用程序。在每个应用程序线程上调用 SQL 存储过程。
-
SQL 代理职位:创建多个 SQL 作业,并使用以下命令从您的进程异步启动它们
sp_start_job
。您可以使用未记录的功能检查它们是否已完成xp_sqlagent_enum_jobs
如中所述这篇优秀的文章 http://www.databasejournal.com/features/mssql/article.php/10894_3491201_2/Detecting-The-State-of-a-SQL-Server-Agent-Job.htm作者:格雷戈里·A·拉森。 (或者按照 Chris 的建议,让作业本身更新您自己的 JOB_PROGRESS 表。)实际上,您必须为预期运行的每个并行进程创建单独的作业,即使它们正在运行具有不同参数的相同存储过程。
-
奥莱自动化: Use
sp_oacreate
and sp_oamethod
启动一个调用另一个存储过程的新进程,如中所述本文 http://www.databasejournal.com/features/mssql/article.php/3427581/Submitting-A-Stored-Procedure-Asynchronously.htm,同样由格雷戈里·A·拉森(Gregory A. Larsen)撰写。
-
DTS包:使用简单的分支任务流创建 DTS 或 SSIS 包。 DTS 将在各个 spid 中启动任务。
-
服务经纪人:如果您使用的是 SQL2005+,请考虑使用服务经纪人 http://technet.microsoft.com/en-us/library/ms166104.aspx
-
CLR 并行执行:使用CLR命令
Parallel_AddSql
and Parallel_Execute
如中所述本文 http://www.codeproject.com/KB/database/asynchronousTSQL.aspx作者:Alan Kaplan(仅限 SQL2005+)。
-
计划的 Windows 任务:列出是为了完整性,但我不喜欢这个选项。
我对 Service Broker 或 CLR 没有太多经验,因此无法对这些选项发表评论。如果是我,我可能会在更简单的场景中使用多个 Job,在更复杂的场景中使用 DTS/SSIS 包。
最后一条评论:SQL 已经尝试尽可能并行化各个操作*。这意味着同时运行 2 个任务而不是依次运行并不能保证它会更快完成。仔细测试看看它是否真的有所改善。
我们有一位开发人员创建了一个 DTS 包来同时运行 8 个任务。不幸的是,它只是一个 4-CPU 服务器:)
*假设默认设置。可以通过更改服务器的最大并行度或亲和性掩码或使用 MAXDOP 查询提示来修改此值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)