我需要在预定的SQL代理作业中调用具有数百个不同参数的存储过程。现在它依次执行。我想用N(例如N = 8)个不同的参数同时执行存储过程。如何使用Transaction SQL并行执行?
它是一个很好的方式来实现它在事务SQL? SQL Server服务代理可以用于此目的吗?任何其他的选择吗?
我需要在预定的SQL代理作业中调用具有数百个不同参数的存储过程。现在它依次执行。我想用N(例如N = 8)个不同的参数同时执行存储过程。如何使用Transaction SQL并行执行?
它是一个很好的方式来实现它在事务SQL? SQL Server服务代理可以用于此目的吗?任何其他的选择吗?
在表的问题的评论中提到了保存调用proc的各种参数,并且执行时间在整个参数值中变化很大。
如果你能够在两个字段添加到parameters-- StartTime DATETIME
和EndTime 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乔布斯直到所有的参数值集合的运行已经执行。它说明了这样一个事实,即某些集合比其他集合运行得更快,因为每个工作只会从队列中选择下一个可用集合,直到没有剩下任务,届时工作将完全退出。
有两点需要考虑增加上述结构:
这可能是在SQL Server中最简单的方法。 – ca9163d9
SQL Server没有内置任何本机来发出来自T-SQL批处理的并行查询。你需要一个外部驱动程序。有人连接N个连接。
如果您创建了N个作业并手动启动它们,则SQL Agent可以执行此操作。这是一种黑客攻击,但它会起作用。
编写一个小的C#应用程序可以做到这一点,并将其放入Windows任务计划程序中可能更容易。
您试图违反SQL Server事务的核心功能,即事务独立于其他事务。您对该sp的一个呼叫不应该依赖于该同一sp的任何其他呼叫。 –
我只想执行具有不同参数的代码片段。给出不同的参数,程序访问完全不同的表。 – ca9163d9
您是否尝试过创建另外7个SQL代理作业并安排它们在同一时间运行?我认为在这种情况下,他们将彼此分开执行1秒。 –