gpt4 book ai didi

sql - CROSS APPLY vs OUTER APPLY速度差

转载 作者:行者123 更新时间:2023-12-01 14:19:49 26 4
gpt4 key购买 nike

我正在使用 CROSS APPLY 加入 Users 和 GeoPhone 表,一切都运行得很快,但现在我在 Phone 列中有值为 NULL 的用户。交叉应用会在最终输出中跳过这些行。所以我切换到外部应用。但它的工作速度要慢得多(当输出中的总行数仅增加 1000 时,速度会慢 15 倍以上)。

SELECT TOP (10000) dbo.Users.Login, dbo.Users.Phone, GeoPhone.Country
FROM dbo.Users CROSS APPLY
(SELECT TOP 1 Country
FROM dbo.GeoPhone
WHERE dbo.Users.Phone <= dbo.GeoPhone.[End]) GeoPhone

相对:
SELECT TOP (10000) dbo.Users.Login, dbo.Users.Phone, GeoPhone.Country
FROM dbo.Users OUTER APPLY
(SELECT TOP 1 Country
FROM dbo.GeoPhone
WHERE dbo.Users.Phone <= dbo.GeoPhone.[End]) GeoPhone

我试图理解为什么。正如我所见,执行计划是不同的。但理论上我看不到任何可能导致这种放缓的计算。

有任何想法吗?

我的最终解决方案:
SELECT TOP (10000) dbo.Users.Login, dbo.Users.Phone, GeoPhone.Country
FROM dbo.Users CROSS APPLY
(SELECT TOP 1 Country
FROM dbo.GeoPhone
WHERE ISNULL(dbo.Users.Phone, 0) <= dbo.GeoPhone.[End]) GeoPhone

这为非空电话分配了实际国家/地区,并为空电话分配了第一个范围内的国家/地区(对于我的情况,这已经是“未知”)。出于某种原因 WHERE dbo.Users.Phone <= dbo.GeoPhone.[End] OR dbo.Users.Phone IS NULL执行相同的结果,但速度要慢得多。

请随时对此发表评论。

最佳答案

CROSS APPLY 是特定于 MSSQL 的... Microsoft on APPLY

APPLY 使右侧查询对左侧查询中的每个结果执行一次。 CROSS 只考虑像 INNER JOIN 这样的匹配行。使用 OUTER 会考虑左侧查询中的所有行。额外的行伤害。

我建议您重新制定右侧查询以明确接受 NULL 而不是使用 OUTER APPLY。

关于sql - CROSS APPLY vs OUTER APPLY速度差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6726696/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com