我有以下功能:
FunctionA - returns Object ID and Detail ID
FunctionB - returns Detail ID and Detail Name
以下查询用于提取Object ID
和:Detail ID
Detail 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
在第二种情况下为每一行执行,还是正在缓存结果并避免执行具有相同参数的函数?