我有一个运行大约 30 秒的 SQL 查询,它返回 1 条记录。使用此记录的 BrandId 运行时,CROSS APPLY 中使用的功能是即时的。
SELECT
b.BrandId,
b.Name,
ah.Type,
c.ContactEmails,
c.ContactNumbers,
c.ContactLinks
FROM
@IdsToFilterBy ids
JOIN dbo.AccountHandler ah ON ah.AccountHandlerId = ids.Id
JOIN dbo.Brand b ON ah.RepresentedByBrandId = b.BrandId
CROSS APPLY dbo.[fn_GetBrandContactDetails](b.BrandId) AS c
但是,如果我只是更改表,我会从 CROSS APPLY..
SELECT
b.BrandId,
b.Name,
ah.Type,
c.ContactEmails,
c.ContactNumbers,
c.ContactLinks
FROM
@IdsToFilterBy ids
JOIN dbo.AccountHandler ah ON ah.AccountHandlerId = ids.Id
JOIN dbo.Brand b ON ah.RepresentedByBrandId = b.BrandId
CROSS APPLY dbo.[fn_GetBrandContactDetails](ah.RepresentedByBrandId) AS c <-- change here
查询现在只需 2 秒即可运行。当我加入dbo.Brand b ON cah.RepresentedByBrandId = b.BrandId
时,我希望他们是一样的。
有人可以解释为什么会有巨大的性能差异吗?
更新
不同之处在于,当我使用 b.BrandId 时,CROSS APPLY 在整个 Brand 表上运行,而当我使用 ah.RepresentedByBrandId 时,则在整个 AccountHandler 表上运行。AccountHandler 表要小得多。
但是,我期望 CROSS APPLY 仅在 JOIN 的结果上运行,这是一个 1 记录。这是可能的还是我错过了理解的交叉应用?