7

我有以下功能:

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

在此处输入图像描述

在以下查询中,我更改了要使用的查询,cross applyinner join返回FunctionB特定Detail NameDetail ID

SELECT FunctionA.ID
      ,FunctionA.DetailID
      ,FunctionB.DetailName
FROM FunctionA (...)
CROSS APPLY FunctionB (FunctionA.DetailID) 
    ON FunctionA.DetailID = FunctionB.DetailID

下面的屏幕截图显示了它的执行计划成本(需要 3 秒):

在此处输入图像描述

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

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

4

2 回答 2

2

CROSS APPLY 旨在与基于参数返回结果的函数和表一起使用。

因此,您查询函数的事实是“CROSS APPLY”更快的原因。

于 2014-04-01T12:12:57.857 回答
2

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

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

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

于 2014-03-06T12:48:54.210 回答