performance - 为什么交叉应用比内连接快?

标签 performance tsql sql-server-2012 inner-join cross-apply

我有以下功能:

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 秒):

enter image description here

在以下查询中,我已将查询更改为使用 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 秒):

enter image description here

第一种情况 FunctionB返回所有对 Detail IDDetail Name而且通常需要很多时间。
在第二种情况下,FunctionB执行速度更快,因为它只返回 Detail Name特定 Detail ID ,但它是为每个 Object ID 执行的.

为什么第一种情况这么慢? SQL Server 是否正在执行 FunctionB在每行的第二种情况下,或者它正在缓存结果并避免执行该函数
具有相同的参数?

最佳答案

我认为交叉应用有时会更快,因为它可以在实际连接完成之前限制被连接的行数,因此实际连接的行数较少。

在您的第二个示例中,从 FunctionB 返回的行数将少于连接整个表时的行数,因此实际连接会更快,总时间会更少。

表中有多少行数据,它们是否正确索引?

关于performance - 为什么交叉应用比内连接快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21986685/

相关文章:

c# - Excel Interop - 效率和性能

sql - 在两个表之间查找修改/新建/删除的记录

sql-server - 如何在 SQL Server 中为多对多关系建模?

sql-server-2008-r2 - 如何将SQL Server 2008 R2数据库转换为SQL Server 2012?

sql - 无法解决排序规则冲突

sql-server - 无法远程连接到 Windows Server 2012 R2 上的 SQL Server 2014

mysql - 处理大量数据时 MySql 中的查询性能

c++ - 如何在 linux 中分析 pthread 互斥锁?

java - 在循环内创建对象与在循环之前创建一个临时对象

sql - 按生日排序,不考虑年份