我有一个表值函数,它构建为SQLCLR函数,用于调用远程Web服务上的计算。我想知道CROSS APPLY函数是否会并行或以顺序方式调用函数?
我不确定支持计算的Web服务是否真的是线程安全的。
交叉申请查询:
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
}
答案 0 :(得分:2)
我不确定CROSS APPLY
是否可以并行执行,但如果您需要确保它不兼容,则可以通过添加OPTION (MAXDOP 1)
来强制查询保持单线程状态查询的底部。
此外,关于通过SQLCLR调用Web服务,请参阅我在以下答案中提到的建议,尤其是关于ServicePointManager
和 2 如果你不想无意中在查询中引入比你通过调用外部资源已经做的更大的瓶颈,则需要手动增加:
答案 1 :(得分:2)
+1这个问题,因为它是一个重要问题。本文提供了一些有关该主题的有用信息:Paul White的Forcing a Parallel Query Execution Plan。
如果没有任何并行性抑制器(例如标量UDF或系统表访问),查询优化器可以选择基于多个因素选择并行或串行计划。
我想知道CROSS APPLY函数是否会调用该函数 平行还是顺序?
APPLY(CROSS APPLY和OUTER APPLY)是 table operator ,就像JOIN,PIVOT和UNPIVOT一样。单独的表运算符没有任何内容会导致优化器选择一个串行或并行计划,除非您的CROSS APPLY引用multi-statement table valued function(内联表值函数很好) 。
强制串行或并行计划
如所罗门所述,您可以使用OPTION(MAXDOP 1)来强制执行连续计划。您可以使用(未记录的)8649 traceflag通过在查询末尾添加OPTION (QUERYTRACEON 8649)
来强制执行并行计划。这将强制优化器选择并行计划,只要它可以。如果您使用traceflag 8649并仍然获得一个串行计划,那么您就知道存在一个并行性抑制组件。
请注意,对于traceflag 8649的替代文档,您可以使用Adam Machanic的make_parallel。