当前位置: 首页 > 面试题库 >

交叉应用与外部应用的速度差异

阴高刚
2023-03-14
问题内容

我当时使用CROSS
APPLY来连接Users和GeoPhone表,并且一切工作都很快,但是现在我在Phone列中有具有NULL值的Users。交叉应用会在最终输出中跳过这些行。所以我切换到OUTER
APPLY。但是它的工作速度非常慢(当输出的总行数仅增加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的…
APPLY上的Microsoft

APPLY导致右侧查询对左侧查询中的每个结果执行一次。CROSS仅考虑匹配行,例如INNER
JOIN。使用OUTER会考虑左侧查询中的所有行。多余的行会伤人。

我建议您重新构造右侧查询以显式接受NULL,而不要使用OUTER APPLY。



 类似资料:
  • 本文向大家介绍SQL 交叉应用和外部应用基础,包括了SQL 交叉应用和外部应用基础的使用技巧和注意事项,需要的朋友参考一下 示例 在正确的表达式中使用表值函数时,将使用Apply。 创建一个Department表来保存有关部门的信息。然后创建一个Employee表,其中包含有关雇员的信息。请注意,每个员工都属于一个部门,因此Employee表与Department表具有参照完整性。 第一个查询从D

  • 问题内容: 我需要在MySQL(EC2 RDS MySQL实例)中使用CROSS APPLY。看起来MySQL无法识别CROSS APPLY语法。有谁可以帮助我吗? 这是查询。 问题答案: 最接近的 直接 逼近是将相关子查询作为谓词的联接。 但是,根据您的情况,您只需要目标表中的一个字段。这意味着您可以直接在SELECT语句中使用相关子查询。

  • 问题内容: 我想为Entity Framework查询创建一些测试用例,这些查询用例肯定会生成包含CROSS APPLY或OUTER APPLY运算符的SQL命令。 有人可以显示出现这类SQL查询的典型情况吗? 问题答案: 在LINQ 2 SQL中,这总是导致: 在EF中,这可能会失败,也可能会导致(我不知道是哪一个)。这是一个 关联联接,在SQL端需要一个。

  • 问题内容: 我需要能够运行外部应用程序并与之交互,就像从命令行手动运行它一样。我发现的所有示例仅涉及运行程序和捕获输出。 下面是一个非常简单的示例,希望该示例说明我要完成的工作。 我试图调整各种示例,发现这些示例以零成功实现了这一目标。看起来,即使“ rm”正在等待响应,Go仍会关闭该过程。 您可以提供的任何示例,文章或建议,将不胜感激。提前谢谢了。 问题答案: 您有两种可能性。首先是使用Read

  • 问题内容: 使用CROSS APPLY的主要目的是什么? 我已经读过(模糊地通过Internet上的帖子),cross apply如果您要进行分区,则在选择大型数据集时可能会更有效率。(想起分页) 我也知道,CROSS APPLY不需要UDF作为右表。 在大多数INNER JOIN查询(一对多关系)中,我可以将它们重写为use CROSS APPLY,但它们始终会为我提供等效的执行计划。 任何人都

  • 问题内容: 我正在x86 ubuntu机器上为树莓派ARM目标编写一些代码。我正在使用gcc-linaro- armhf工具链。我能够交叉编译并在pi上运行一些独立程序。现在,我想将代码与外部库(例如ncurses)链接。我该如何实现。 我应该将程序与主机上现有的ncurses lib链接,然后在ARM上运行吗?(我认为这行不通)我是否需要为arm获取lib的源代码或预构建版本,将其放在我的lib