【问题标题】:SQL CROSS APPLY with SQLCLR Table-Valued Function (TVF)SQL CROSS APPLY 与 SQLCLR 表值函数 (TVF)
【发布时间】:2018-04-21 17:14:13
【问题描述】:

我有一个作为 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
}

【问题讨论】:

    标签: sql-server web-services tsql sqlclr


    【解决方案1】:

    我不确定CROSS APPLY 是否可以并行,但如果您需要确保它不能并行,您可以通过在底部添加OPTION (MAXDOP 1) 来强制查询保持单线程查询。

    另外,关于通过 SQLCLR 调用 Web 服务,请参阅我在以下答案中提到的建议,尤其是关于 ServicePointManager 和默认并发连接限制仅为 2 的建议如果您不想无意中在查询中引入比您已经通过调用外部资源所做的更大的瓶颈,则需要手动增加:

    SQL CLR Web Service Call: Limiting Overhead

    【讨论】:

      【解决方案2】:

      +1 这个问题很重要。这篇文章包含一些关于该主题的有用信息:Forcing a Parallel Query Execution Plan,作者 Paul White。

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

      我想知道 CROSS APPLY 函数是否会在 并行还是顺序?

      APPLY(CROSS APPLY 和 OUTER APPLY)是一个 table operator,就像 JOIN、PIVOT 和 UNPIVOT。单独的表运算符不会导致优化器选择串行或并行计划而不是另一个,除非您的 CROSS APPLY 引用 multi-statement table valued function内联表值函数很好)。

      强制串行或并行计划

      正如所罗门所说,您可以使用 OPTION (MAXDOP 1) 来强制执行串行计划。您可以使用(未​​记录的)8649 跟踪标志通过在查询末尾添加OPTION (QUERYTRACEON 8649) 来强制执行并行计划。这将强制优化器选择一个并行计划只要它可以。如果您使用 traceflag 8649 并且仍然获得串行计划,那么您就知道有一个并行性抑制组件在起作用。

      请注意,对于跟踪标志 8649 的记录替代方案,您可以使用 Adam Machanic 的 make_parallel

      【讨论】:

      • 感谢您的回答。您认为 SQLCLR 函数会被视为多语句表值函数吗?我的实际执行计划(没有 MAXDOP 1)是一个调用表值函数的嵌套循环,根据您发布的文章,它看起来像一个 MTVF 执行计划。
      猜你喜欢
      • 2011-06-25
      • 2014-12-04
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 2011-10-07
      • 2019-09-07
      • 1970-01-01
      相关资源
      最近更新 更多