我可以使用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:随意编辑我的标题,我不知道如何正确命名问题。
答案 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.
两个查询都有相同的执行计划,因此它们将花费相同的时间:)