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在第二种情况下为每一行执行,或者它是否缓存结果并避免执行具有相同参数的函数?
| 归档时间: |
|
| 查看次数: |
2493 次 |
| 最近记录: |