我有以下功能:
FunctionA - returns Object ID and Detail ID
FunctionB - returns Detail ID and Detail Name
以下查询用于提取Object ID和:Detail IDDetail Name
SELECT FunctionA.ID
,FunctionA.DetailID
,FunctionB.DetailName
FROM FunctionA (...)
INNER JOIN FunctionB (...)
ON FunctionA.DetailID = FunctionB.DetailID
下面的屏幕截图显示了它的执行计划成本(需要 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
下面的屏幕截图显示了它的执行计划成本(需要 3 秒):

在第一种情况下,FunctionB返回所有对Detail ID,Detail Name通常需要很长时间。在第二种情况下,FunctionB执行速度更快,因为它只返回Detail Name特定的Detail ID,但它是为每个执行的Object ID。
为什么第一种情况这么慢?SQL Server 是FunctionB在第二种情况下为每一行执行,还是正在缓存结果并避免执行具有相同参数的函数?