Sql server 链接和联接的Sql Server性能问题

Sql server 链接和联接的Sql Server性能问题,sql-server,Sql Server,哪一个在一大组记录上的性能更好 select name from tablea,tableb where tablea.id = tableb.id 或 这里我给出了一个简单的例子,但是在我们的项目中,我们使用了很多表和连接来获取记录。在这个更复杂的情况下,哪一个会提供更高的性能,链接还是连接?两者都不是。在任何情况下,都应始终使用ANSI连接 使用ANSI连接不仅仅需要考虑样式问题: 在SQL Server的未来版本中,可能不支持非标准联接 不能使用旧式语法执行所有类型的联接。例如,以下

哪一个在一大组记录上的性能更好

select  name from tablea,tableb where tablea.id = tableb.id


这里我给出了一个简单的例子,但是在我们的项目中,我们使用了很多表和连接来获取记录。在这个更复杂的情况下,哪一个会提供更高的性能,链接还是连接?

两者都不是。在任何情况下,都应始终使用ANSI连接

使用ANSI连接不仅仅需要考虑样式问题:

  • 在SQL Server的未来版本中,可能不支持非标准联接
  • 不能使用旧式语法执行所有类型的联接。例如,以下ANSI样式查询:

    SELECT
    FROM
        dbo.Customer C
        LEFT JOIN dbo.Address A
            ON C.CustomerID = A.CustomerID
            AND A.AddressType = 'Home' -- this can't be done with non-ANSI
    WHERE
        A.CustomerID IS NULL
    ;
    
  • 使用
    JOIN
    可以向开发人员更清楚地表达查询的意图,方法是在
    JOIN
    子句中分离特定于表如何始终相互关联的机制的条件,并将特定于此查询需要的条件放在
    WHERE
    子句中。在
    WHERE
    子句中加入所有条件(连接和过滤)会使
    WHERE
    子句变得杂乱无章,使复杂的查询非常难以理解
  • 使用
    JOIN
    可以使连接表的条件在物理上靠近脚本中引入该表的位置,从而降低出错的可能性并进一步帮助理解
我将绝对明确地声明,使用旧式连接而不是ANSI连接不会带来任何性能好处。如果使用
ANSI
联接的查询太复杂,优化器无法做好工作,那么老式联接的效果是好是坏只是一个偶然的问题。反之亦然,如果使用旧式联接的查询太复杂,优化器无法很好地完成,那么ANSI联接的效果是好是坏只是一个机会问题

对于性能不佳的查询,正确的解决方案是让专家研究查询、表和底层索引并提出建议。将查询分为两部分(首先插入临时表,然后加入临时表)可能会使查询受益。可能缺少索引。数据类型的选择可能很差。聚集索引可能需要从
PK
移动到另一列。查询上的条件可能可以转换为可搜索的条件。新引入的列上的日期函数可能会被删除,以支持日期不相等条件,而不是使用常量或先前引入的列预先计算的表达式。可能存在实际影响性能的非规范化


有很多因素会影响性能,我向您保证,我所拥有的每一点信念都是,回到旧式连接将永远不会是答案。

。在任何情况下,都应始终使用ANSI连接

使用ANSI连接不仅仅需要考虑样式问题:

  • 在SQL Server的未来版本中,可能不支持非标准联接
  • 不能使用旧式语法执行所有类型的联接。例如,以下ANSI样式查询:

    SELECT
    FROM
        dbo.Customer C
        LEFT JOIN dbo.Address A
            ON C.CustomerID = A.CustomerID
            AND A.AddressType = 'Home' -- this can't be done with non-ANSI
    WHERE
        A.CustomerID IS NULL
    ;
    
  • 使用
    JOIN
    可以向开发人员更清楚地表达查询的意图,方法是在
    JOIN
    子句中分离特定于表如何始终相互关联的机制的条件,并将特定于此查询需要的条件放在
    WHERE
    子句中。在
    WHERE
    子句中加入所有条件(连接和过滤)会使
    WHERE
    子句变得杂乱无章,使复杂的查询非常难以理解
  • 使用
    JOIN
    可以使连接表的条件在物理上靠近脚本中引入该表的位置,从而降低出错的可能性并进一步帮助理解
我将绝对明确地声明,使用旧式连接而不是ANSI连接不会带来任何性能好处。如果使用
ANSI
联接的查询太复杂,优化器无法做好工作,那么老式联接的效果是好是坏只是一个偶然的问题。反之亦然,如果使用旧式联接的查询太复杂,优化器无法很好地完成,那么ANSI联接的效果是好是坏只是一个机会问题

对于性能不佳的查询,正确的解决方案是让专家研究查询、表和底层索引并提出建议。将查询分为两部分(首先插入临时表,然后加入临时表)可能会使查询受益。可能缺少索引。数据类型的选择可能很差。聚集索引可能需要从
PK
移动到另一列。查询上的条件可能可以转换为可搜索的条件。新引入的列上的日期函数可能会被删除,以支持日期不相等条件,而不是使用常量或先前引入的列预先计算的表达式。可能存在实际影响性能的非规范化


有许多因素会影响性能,我向您保证,我所拥有的每一点信念都是,回到旧式连接永远不会是答案。

在这个简化的示例中,性能应该完全相同。如果在这两个选项上运行查询分析器,您将看到优化器在任何情况下都会将WHERE转换为连接


不过,您可能能够编写一个复杂到足以让优化器感到困惑的查询,所以请坚持使用联接。

在这个简化的示例中,性能应该完全相同。如果在这两个选项上运行查询分析器,您将看到优化器在任何情况下都会将WHERE转换为连接

你也许可以