T - SQL中的并行处理

Sim*_*ran 1 sql-server

我有一个存储过程,一个接一个地调用35 Inline table valued functions(TVF).

所有这些内联TVF都返回了dbo.Match函数的计算结果表.

这里的问题是,尽管所有适当的索引都已到位,但只有当前一个内联TVF完成其结果时才会调用下一个内联TVF.我想要一种并行执行这些的方法,以便不必等待其他人完成,可以将它们转换为程序或任何其他适合性能和并行处理的信封吗?

由于dbo.Match功能是共同所有,并基于来自声明内联TVF传递的参数结果,我相信,如果有一个概念,将同步threadssql.那么,是否有任何可用的工作来解决这些问题以减少执行时间?

我附上了一些代码,以便对我所说的内容有一个很好的了解:

      if @firstname is not null
      begin
      SELECT @constVal = FunctionWeight 
     FROM   dbo.FunctionWeights WHERE  FunctionWeights.FunctionId = 1;
      INSERT INTO #Temp2  
     (RowNumber,ValFromUser,ColumnName,ValFromFunc,FuncWeight,percentage) 
     SELECT RowNumber,@firstname,'firstname',PercentMatch,@constVal,PercentMatch * @constVal     FROM   dbo.MatchFirstName(@firstname, @checkbool)
    END 



if @Middlename is not null
  BEGIN
      SELECT @constVal = FunctionWeight FROM   dbo.FunctionWeights
 WHERE  FunctionWeights.FunctionId = 2;
  INSERT INTO #Temp2 (RowNumber,ValFromUser,ColumnName,ValFromFunc,FuncWeight,percentage)
      SELECT RowNumber, @MiddleName,'Middlename',PercentMatch, @constVal,PercentMatch * @constVal 
      FROM   dbo.MatchMiddleName(@MiddleName, @checkbool)
END 
Run Code Online (Sandbox Code Playgroud)

Dam*_*ver 5

在SQL中,您告诉系统您想要什么,而不是如何操作.你最好通过给它整个查询来优化,然后让它弄清楚如何.所以你要做的事情如下:

INSERT INTO #Temp2  
(RowNumber,ValFromUser,ColumnName,ValFromFunc,FuncWeight,percentage) 
SELECT RowNumber,@firstname,'firstname',
       PercentMatch,fw1.FunctionWeight,
       PercentMatch * fw1.FunctionWeight
FROM   dbo.FunctionWeights fw1
         CROSS JOIN
       dbo.MatchFirstName(@firstname, @checkbool) mfn
WHERE
     fw1.FunctionId = 1 AND
     @firstname is not null
UNION ALL
SELECT RowNumber, @MiddleName,'Middlename',
       PercentMatch, fw2.FunctionWeight,
       PercentMatch * fw2.FunctionWeight 
FROM   dbo.FunctionWeights fw2
         CROSS JOIN
       dbo.MatchMiddleName(@MiddleName, @checkbool) mmn
WHERE
     fw2.FunctionId = 2 AND
     @MiddleName IS NOT NULL
UNION ALL
...
Run Code Online (Sandbox Code Playgroud)

依此类推 - 只需将每个查询添加到这个UNION ALL组合了所有SELECTs的大型查询中,并尝试IFWHERE子句条件替换逻辑.

对于传递给函数的参数依赖于来自其他表的数据的更复杂的查询,您可能还需要研究使用CROSS APPLY而不是CROSS JOIN更复杂的连接条件.