使用SQL CLR表值函数(TVF)的SQL CROSS APPLY

3

我有一个表值函数,它是一个调用远程Web服务计算的SQLCLR函数。我想知道CROSS APPLY函数会以并行方式还是顺序方式调用函数。

我不确定支持计算的Web服务是否真的是线程安全的。

Cross-apply查询:

WITH listCTE AS
(
SELECT 'definition1' AS def UNION ALL
SELECT 'definition2' AS def UNION ALL 
SELECT 'definition3' AS def 
)
SELECT calc.*
FROM listCTE a
CROSS APPLY dbo.f_webservice_calculate (a.def,'2017-06-30') calc

SQLCLR TVF函数定义。
[SqlFunction(
    Name = "f_webservice_calculate",
    DataAccess = DataAccessKind.Read,
    FillRowMethodName = "fillRowMethod",           
    SystemDataAccess = SystemDataAccessKind.Read
)]
public static IEnumerable f_webservice_calculate(string def, DateTime date)
{
...calling web service using HttpWebRequest
}
2个回答

3
我不确定是否可以并行处理,但如果您需要确保它不会这样做,您可以通过在查询底部添加

3

这是一个重要的问题,我为此点赞。这篇文章Forcing a Parallel Query Execution Plan by Paul White提供了一些有用的信息。

如果没有任何并行性抑制因素(例如标量UDF或系统表访问),查询优化器可以根据多种因素选择并行或串行计划。

我想知道CROSS APPLY函数是以并行还是顺序方式调用函数的?

APPLY(CROSS APPLY和OUTER APPLY)与JOIN、PIVOT和UNPIVOT一样,是一种表运算符。仅有表运算符本身不会导致优化器选择串行计划还是并行计划,除非你的CROSS APPLY引用了一个多语句表值函数(内联表值函数可以)。 强制串行或并行计划 如Solomon所述,您可以使用OPTION (MAXDOP 1)强制使用串行计划。您可以使用(未记录的)8649跟踪标志通过在查询末尾添加OPTION (QUERYTRACEON 8649)来强制使用并行计划。这将强制优化器选择并行计划,前提是它能够选择并行计划。如果您使用跟踪标志8649仍然得到串行计划,则说明存在抑制并行性的组件。
请注意,作为跟踪标志8649的文档替代方案,您可以使用Adam Machanic的make_parallel

感谢您的回答。您认为SQLCLR函数是否被视为多语句表值函数?我的实际执行计划(没有MAXDOP 1)是调用表值函数的嵌套循环,根据您发布的文章,看起来像是MTVF执行计划。 - Vincent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接