2014-07-17 49 views
1

我需要在预定的SQL代理作业中调用具有数百个不同参数的存储过程。现在它依次执行。我想用N(例如N = 8)个不同的参数同时执行存储过程。如何使用Transaction SQL并行执行?

它是一个很好的方式来实现它在事务SQL? SQL Server服务代理可以用于此目的吗?任何其他的选择吗?

+0

您试图违反SQL Server事务的核心功能,即事务独立于其他事务。您对该sp的一个呼叫不应该依赖于该同一sp的任何其他呼叫。 –

+1

我只想执行具有不同参数的代码片段。给出不同的参数,程序访问完全不同的表。 – ca9163d9

+0

您是否尝试过创建另外7个SQL代理作业并安排它们在同一时间运行?我认为在这种情况下,他们将彼此分开执行1秒。 –

回答

1

在表的问题的评论中提到了保存调用proc的各种参数,并且执行时间在整个参数值中变化很大。

如果你能够在两个字段添加到parameters-- StartTime DATETIMEEndTime DATETIME表--then您可以创建7个SQL代理作业,并让他们安排在同一时间运行。

每个作业的作业步骤应该是相同的,应该是类似以下内容:

DECLARE @Params TABLE (ParamID INT, Param1 DataType, Param2 DataType, ...); 
DECLARE @ParamID INT, 
     @Param1Variable DataType, 
     @Param2Variable DataType, 
     ...; 

WHILE (1 = 1) 
BEGIN 
    UPDATE TOP (1) param 
    SET param.StartTime = GETDATE() -- or GETUTCDATE() 
    OUTPUT INSERTED.ParamID, INSERTED.Param1, INSERTED.Param2, ... 
    INTO @Params (ParamID, Param1, Param2, ...) 
    FROM Schema.ParameterTable param 
    WHERE param.StartTime IS NULL; 

    IF (@@ROWCOUNT = 0) 
    BEGIN 
     BREAK; -- no rows left to process so just exit 
    END; 

    SELECT @ParamID = tmp.ParamID, 
      @Param1Variable = tmp.Param1, 
      @Param2Variable = tmp.Param2, 
    FROM @Params tmp; 

    BEGIN TRY 
     EXEC Schema.MyProc @Param1Variable, @Param2Variable, ... ; 

     UPDATE param 
     SET param.EndTime = GETDATE() -- or GETUTCDATE() 
     FROM Schema.ParameterTable param 
     WHERE param.ParamID = @ParamID; 
    END TRY 
    BEGIN CATCH 
     ... do something here... 
    END CATCH; 

    DELETE FROM @Params; // clear out last set of params 
END; 

,通用结构应该允许8个SQL乔布斯直到所有的参数值集合的运行已经执行。它说明了这样一个事实,即某些集合比其他集合运行得更快,因为每个工作只会从队列中选择下一个可用集合,直到没有剩下任务,届时工作将完全退出。

有两点需要考虑增加上述结构:

  • 重置开始时间字段为空,因此该行可以在以后
  • 处理错误的方式重新运行的方式(即清洁StartTime IS NOT NULL和EndTime IS NULL,以及StartTime和GETDATE/GETUTCDATE之间的DATEDIFF太多,TRY/CATCH可以通过将StartTime设置回NULL来重新运行或者可以添加第三个字段对于在运行开始时重置为NULL(如其他2个字段)的ErrorTime DATETIME,但只在发生错误时才设置。这些仅仅是一些想法。
+0

这可能是在SQL Server中最简单的方法。 – ca9163d9

1

SQL Server没有内置任何本机来发出来自T-SQL批处理的并行查询。你需要一个外部驱动程序。有人连接N个连接。

如果您创建了N个作业并手动启动它们,则SQL Agent可以执行此操作。这是一种黑客攻击,但它会起作用。

编写一个小的C#应用​​程序可以做到这一点,并将其放入Windows任务计划程序中可能更容易。