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 ID
和Detail Name
,通常需要花费大量的时间.在第二种情况下,FunctionB
执行得更快,因为它仅返回Detail Name
特定的Detail ID
,但是为每个执行Object ID
.
为什么第一种情况如此慢?SQL Server是否FunctionB
在第二种情况下为每一行执行,或者它是否缓存结果并避免执行具有相同参数的函数?