【问题标题】:Does SQL Server automatically discard unnecessary joins?SQL Server 会自动丢弃不必要的连接吗?
【发布时间】:2010-07-27 09:56:56
【问题描述】:

如果我向 SQL Server 2005 提交一个查询,其中包含许多 LEFT JOIN 子句,其中连接的表从未被引用,连接是否仍然会发生,或者 SQL Server 是否足够智能以丢弃它们?

显然它不能丢弃 INNER JOIN [错误假设!查看答案],因为这可能会改变结果,但它可以为 LEFT JOIN 做吗?

【问题讨论】:

    标签: sql-server sql-server-2005 query-optimization


    【解决方案1】:

    可以通过检查约束来丢弃 INNER 和 LEFT JOIN。如果您不使用表中的列并且通过(FK)约束保证单行存在,则不需要使用该表。显然这取决于查询,有可能该表仍然被使用,因为它是最好的计划。

    这是约束tremendously useful and should be considered more frequently 的另一个原因,而不是通常在设计中的约束。

    【讨论】:

    • 感谢您的洞察力,我已经编辑了这个问题,以向未来的读者强调我的错误假设。
    【解决方案2】:

    如果有很多匹配项,左连接可能会增加您的结果集。

    因此它仍然会被评估。

    【讨论】:

    • 当然;我没有想到,谢谢。如果我添加了一个 DISTINCT - 这可能还不错,因为我只选择一个表的主键 - 那么它会优化左连接吗?
    • 最简单的方法就是尝试一下。查看有无加入的执行计划。
    • 感谢您的提示;在我的具体情况下,即使没有 DISTINCT,SQL Server 也能够优化所有不需要的左连接。我想它能够从表上的现有约束和唯一索引推断出每个连接永远不会有多个匹配项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 2021-09-06
    • 2021-05-27
    • 2022-01-22
    相关资源
    最近更新 更多