【问题标题】:Start stored procedures sequentially or in parallel顺序或并行启动存储过程
【发布时间】:2011-01-10 23:58:27
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: sql sql-server tsql sql-server-2000 parallel-processing


    【解决方案1】:

    我最近不得不对此进行研究,因此发现了这个老问题,正在寻求更完整的答案。完全明确地说:TSQL (本身)有能力异步启动其他 TSQL 操作

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

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

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

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

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

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

    【讨论】:

    【解决方案2】:

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

    然后从你的主进程中开始工作。

    我能想到的唯一等待方法是,如果您有一个状态表,每个 proc 完成时都会更新它。

    然后另一个作业可以轮询该表以完全完成并启动最终过程。或者,您可以在此表上设置触发器。

    内存影响完全取决于您的环境..

    更新: 如果您可以访问任务系统..那么您可以采用相同的方法。只需让 windows 执行多个任务,每个任务负责一个过程。然后在所有任务完成后使用状态表上的触发器来启动某些内容。

    更新 2: 此外,如果您愿意创建一个新应用程序,您可以将所有逻辑包含在一个 exe 中...

    【讨论】:

    • 听起来这样可行,但这里不鼓励创造就业机会。甚至我在这里谈论的主要过程也不是一项工作——它通过与 Windows 计划任务不同的程序运行。
    • .exe 的想法更有吸引力,但我仍然想知道是否可以在 sql server 本身中以合理的方式执行此操作。应该是,如果不是。
    【解决方案3】:

    您确实需要将隔夜存储过程转移到工作中。 SQL Server 作业控制将让您完成您要求的所有计划。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多