与加入相关的表现和地点

时间:2011-11-21 13:53:37

标签: sql sql-server tsql

我可以使用join中的where子句或join之外的where子句生成相同的结果,例如:

select *
from a
join b on b.id = a.id and b.type = 1

select *
from a
join b on b.id = a.id
where
    b.type = 1

哪个更好?为什么呢?

ps:随意编辑我的标题,我不知道如何正确命名问题。

6 个答案:

答案 0 :(得分:3)

对于INNER JOIN,这与既不是性能也不是返回的结果集视角没有任何区别。但是对于OUTER (LEFT/RIGHT/FULL) JOIN结果集会有所不同,因为JOIN返回的WHERE子句过滤行,并且在OUTER (LEFT/RIGHT/FULL) JOIN“可空”条目的情况下可以返回,因此结果集会更宽。 (显然,OUTER (LEFT/RIGHT/FULL) JOIN中的大数据集条件可以更快地运行)

答案 1 :(得分:2)

SQL Server查询调控器会将其编译为完全相同的查询计划。

我更喜欢第二种形式,因为它更具可读性。您可以更清楚地将连接条件与过滤条件分开。

答案 2 :(得分:2)

结果是否相同无关紧要。数据库将为两个查询创建相同的执行计划。

如果使用外连接,则结果会有所不同。这将限制已加入的记录:

select *
from a
left join b on b.id = a.id and b.type = 1

然而,这将限制返回的记录,有效地将左连接转换为内连接,但很可能具有更差的性能:

select *
from a
left join b on b.id = a.id
where b.type = 1

答案 3 :(得分:1)

我们不能说一般哪个更好。性能取决于您的数据,索引以及查询优化器处理查询的方式。要真正告诉哪个更好,你应该在两者上运行Explain Plan。这将为您提供有关哪种情况更适合此特定情况的具体信息。

答案 4 :(得分:1)

您可以使用查询执行计划(在SQL Management Studio上)来验证此查询和许多其他查询以相同的方式执行。

执行计划是学习编写最佳查询的最佳工具。

答案 5 :(得分:0)

使用 Sybase ASE 15.0并且两个表都没有统计信息:

首次查询

STEP 1
    The type of query is SELECT.

    FROM TABLE
        b
    Nested iteration.
    Table Scan.
    Forward scan.
    Positioning at start of table.
    Using I/O Size 2 Kbytes for data pages.
    With LRU Buffer Replacement Strategy for data pages.

    FROM TABLE
        a
    Nested iteration.
    Table Scan.
    Forward scan.
    Positioning at start of table.
    Using I/O Size 2 Kbytes for data pages.
    With LRU Buffer Replacement Strategy for data pages.

第二次查询

STEP 1
    The type of query is SELECT.

    FROM TABLE
        b
    Nested iteration.
    Table Scan.
    Forward scan.
    Positioning at start of table.
    Using I/O Size 2 Kbytes for data pages.
    With LRU Buffer Replacement Strategy for data pages.

    FROM TABLE
        a
    Nested iteration.
    Table Scan.
    Forward scan.
    Positioning at start of table.
    Using I/O Size 2 Kbytes for data pages.
    With LRU Buffer Replacement Strategy for data pages.

两个查询都有相同的执行计划,因此它们将花费相同的时间:)