gpt4 book ai didi

sql - 顺序或并行启动存储过程

转载 作者:行者123 更新时间:2023-12-02 09:10:22 25 4
gpt4 key购买 nike

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

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

目前我们仍然使用 SQL Server 2000。

顺便说一句,这很重要,因为主程序是响应从大型机系统将数据转储到服务器的完成而启动的。主机转储每晚大约需要 2 个小时,而且我们无法控制它。因此,我们不断尝试寻找减少处理时间的方法。

最佳答案

我最近不得不研究这个问题,所以发现了这个老问题,需要一个更完整的答案。完全明确地说:TSQL (本身)能够异步启动其他 TSQL 操作

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

  • 自定义应用:使用异步方法以您选择的语言编写简单的自定义应用。在每个应用程序线程上调用 SQL 存储过程。
  • SQL 代理作业:创建多个 SQL 作业,并使用 sp_start_job 从您的进程异步启动它们。您可以使用未记录的函数 xp_sqlagent_enum_jobs 来检查它们是否已完成,如 this excellent article 中所述。作者:格雷戈里·A·拉森。 (或者按照 Chris 的建议,让作业本身更新您自己的 JOB_PROGRESS 表。)实际上,您必须为预期运行的每个并行进程创建单独的作业,即使它们正在使用不同的参数运行相同的存储过程。
  • OLE 自动化:使用 sp_oacreatesp_oamethod 启动一个新进程,调用其他存储过程,如 this article 中所述。 ,同样由格雷戈里·A·拉森 (Gregory A. Larsen) 撰写。
  • DTS 包:使用简单的分支任务流创建 DTS 或 SSIS 包。 DTS 将在各个 spid 中启动任务。
  • Service Broker:如果您使用的是 SQL2005+,请考虑使用 Service Broker
  • CLR 并行执行:使用 CLR 命令 Parallel_AddSqlParallel_Execute,如 this article 中所述。作者:Alan Kaplan(仅限 SQL2005+)。
  • 计划的 Windows 任务:列出是为了完整性,但我不喜欢此选项。

我对 Service Broker 或 CLR 没有太多经验,因此无法对这些选项发表评论。如果是我,我可能会在更简单的场景中使用多个 Job,在更复杂的场景中使用 DTS/SSIS 包。

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

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

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

关于sql - 顺序或并行启动存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/349951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com