【问题标题】:SQL Server execute several commands simultaneouslySQL Server 同时执行多个命令
【发布时间】:2011-06-21 14:02:25
【问题描述】:

我有一个存储过程,我需要执行 100 次(每个参数一个)。我想知道是否可以使用批处理或类似方法同时执行所有这些操作,以便加快处理速度,而不是执行一个然后执行下一个。

谢谢!

【问题讨论】:

  • 这听起来有点像程序解决方案,而不是基于集合的解决方案。如果您向我们展示一些代码,我们可能会告诉您一种方法,您可以只调用一次存储过程。
  • 你从哪里执行过程?另一个 SQL 批处理,还是某种外部调用者,如(支持线程的......).NET 程序集?此外,100 次并行执行不一定会“加速”处理 - 您是否确保此 proc 运行大量并发实例时不会发生锁定、资源争用等?
  • 我在一个表中有记录,我正在循环并通过 proc 运行它们。我正在处理 200 万条记录,并试图找到最快的方法来处理所有记录
  • 另外我正在从 SSMS 执行 proc。

标签: sql sql-server


【解决方案1】:

你能重写你的过程来接受TABLE参数,用100个值填充它,并处理表而不是100个标量吗?

【讨论】:

    【解决方案2】:

    要直接回答您的问题,您可以打开 100 个单独的连接并同时执行 100 个单独的查询。

    但正如已经提到的,我认为这不是你的解决方案。


    由于您有一个包含 100 个值的表,因此您似乎有一些选择...


    • 将 StoredProcedure 更改为视图,并加入视图。
    • 将 StoredProcedure 更改为表值函数,并使用 CROSS APPLY。
      (内联函数将比多语句函数执行得更好。)

    这两个受限于视图和函数都不能有任何副作用的事实......不能写入表格等。


    如果无法重构代码以使用视图或函数,则仍需要存储过程来封装代码。

    在这种情况下,您可以:
    - 将值表作为表值参数传递。
    - 或者直接从表中读取存储过程。

    根据您的需要,您甚至可能希望创建一个专门供该 SP 读取的表。不过,这会带来一些额外的问题...
    - 并发:如何将我的数据与其他人分开?有一个字段来保存唯一标识符,例如会话的 @@SPID。
    - 清理:您不希望进程整天插入数据,但从不删除它。


    我强烈建议您避免的一件事是使用循环/游标。如果您能找到基于集合的方法,请使用它:)


    编辑

    您刚刚留下的评论提到您有数百万条记录需要处理。

    这使得使用基于集合的方法更加可取。但是,您可能会发现这会创建非常大的事务(如果您正在执行大量 INSERT、UPDATE 等操作)。在这种情况下,仍然要找到一种基于集合的方法,然后找到一种方法,将其分成更小的部分(如果数据与时间相关,则按天拆分,或者一次只有 1000 条记录,只要合适。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      相关资源
      最近更新 更多