【问题标题】:Parallel execution of stored procedures in Transact SQLTransact SQL 中存储过程的并行执行
【发布时间】:2012-11-25 14:08:31
【问题描述】:

大家好,

我想在 SQL Server 2008 中并行执行存储过程。我不会使用任何外部工具(SSIS、CLR)。我决定采用rusanu's blog 中提到的方法并尝试使用服务代理。

现在到并行执行 - 我已将 MAX_QUEUE_READERS 设置为 5 并尝试执行几个长时间运行的程序。我注意到,他们仍然连续被执行。我会假设他们在不同的对话中,因此激活应该发生多次。 如果我假设错误,请纠正我。

感谢您的解释。

【问题讨论】:

  • 也许你的“线程”因为阻塞而等待?
  • 据我所知,队列有内部(NOLOCK)选项,从而防止阻塞当前处理的消息。此外,每个对话都在不同的对话组中,因此不应阻止它们。但是再一次 - 如果我错了,请纠正我
  • 没错,我的意思是消息正在进行的处理。他们肯定是在对其他数据进行操作吗?
  • 您的激活程序到底在做什么?您是重复使用相同的对话句柄,还是每次都从头开始生成一个新的句柄?
  • 我只使用了无法处理相同数据的测试方法 - 使用 WAITFOR 模拟长时间运行的过程此外,我正在为每个对话生成新句柄。

标签: sql-server sql-server-2008 service-broker


【解决方案1】:

激活最多每 5 秒启动一个新线程,当且仅当在这 5 秒内有 RECIEVE 到达队列底部(返回空结果集)。因此,要实现 5 个线程,您需要等待 20 秒才能开始,在这 20 秒内,您应该有足够的消息,不会有任何线程进入空闲状态。

【讨论】:

  • 太棒了!谢谢,显然我所有的测试程序都运行不到 5 秒。我不知道 5 秒的启动间隔 - Service Broker 的任何 BOL 中是否提到过它?
  • 不确定是否在 BOL 中提及,可能会被忽略,因此可以更改而无需宣布/弃用。但是在论坛和讨论中的多个地方都提到过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
相关资源
最近更新 更多