为什么交叉应用比内连接更快?

got*_*tqn 7 t-sql performance inner-join cross-apply sql-server-2012

我有以下功能:

FunctionA - returns Object ID and Detail ID
FunctionB - returns Detail ID and Detail Name
Run Code Online (Sandbox Code Playgroud)

以下查询用于提取Object ID,Detail ID并且Detail Name:

SELECT FunctionA.ID
      ,FunctionA.DetailID
      ,FunctionB.DetailName
FROM FunctionA (...)
INNER JOIN FunctionB (...) 
    ON FunctionA.DetailID = FunctionB.DetailID
Run Code Online (Sandbox Code Playgroud)

下面的屏幕截图显示了其执行计划成本(需要32秒):

在此输入图像描述

在下面的查询我已经改变了使用的查询cross apply ,而不是inner join搞得FunctionB返回Detail Name特定的Detail ID:

SELECT FunctionA.ID
      ,FunctionA.DetailID
      ,FunctionB.DetailName
FROM FunctionA (...)
CROSS APPLY FunctionB (FunctionA.DetailID) 
    ON FunctionA.DetailID = FunctionB.DetailID
Run Code Online (Sandbox Code Playgroud)

下面的屏幕截图显示了其执行计划成本(需要3秒):

在此输入图像描述

在第一种情况下FunctionB返回所有对Detail IDDetail Name,通常需要花费大量的时间.在第二种情况下,FunctionB执行得更快,因为它仅返回Detail Name特定的Detail ID,但是为每个执行Object ID.

为什么第一种情况如此慢?SQL Server是否FunctionB在第二种情况下为每一行执行,或者它是否缓存结果并避免执行具有相同参数的函数?

小智 2

CROSS APPLY 旨在与基于参数返回结果的函数和表一起使用。

因此,您查询函数的事实就是“CROSS APPLY”更快的原因。