我有以下功能:
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
在每行的第二种情况下,或者它正在缓存结果并避免执行该函数具有相同的参数?
最佳答案
我认为交叉应用有时会更快,因为它可以在实际连接完成之前限制被连接的行数,因此实际连接的行数较少。
在您的第二个示例中,从 FunctionB 返回的行数将少于连接整个表时的行数,因此实际连接会更快,总时间会更少。
表中有多少行数据,它们是否正确索引?
关于performance - 为什么交叉应用比内连接快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21986685/