我有一个存储过程,一个接一个地调用35 Inline table valued functions(TVF).
所有这些内联TVF都返回了dbo.Match函数的计算结果表.
这里的问题是,尽管所有适当的索引都已到位,但只有当前一个内联TVF完成其结果时才会调用下一个内联TVF.我想要一种并行执行这些的方法,以便不必等待其他人完成,可以将它们转换为程序或任何其他适合性能和并行处理的信封吗?
由于dbo.Match功能是共同所有,并基于来自声明内联TVF传递的参数结果,我相信,如果有一个概念,将同步threads在sql.那么,是否有任何可用的工作来解决这些问题以减少执行时间?
我附上了一些代码,以便对我所说的内容有一个很好的了解:
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)
在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的大型查询中,并尝试IF用WHERE子句条件替换逻辑.
对于传递给函数的参数依赖于来自其他表的数据的更复杂的查询,您可能还需要研究使用CROSS APPLY而不是CROSS JOIN更复杂的连接条件.
| 归档时间: |
|
| 查看次数: |
181 次 |
| 最近记录: |