【发布时间】:2020-12-17 09:34:41
【问题描述】:
考虑以下两个查询:
select *
from
table1 t1
left join
table2 t2
on t1.Id = t2.t1Id and (t1.Status = 1 or t2.Id is not null)
还有这个
select *
from
table1 t1
left join
table2 t2
on t1.Id = t2.t1Id
where
t1.Status = 1 or t2.Id is not null
第一个在 2 秒内运行。 2分钟内第二个。执行计划不应该一样吗?
【问题讨论】:
-
它们产生不同的结果集。从逻辑上讲,他们不可能有完全相同的计划。
-
请详细说明。结果有什么不同。
-
使用
declare @table1 table (Id int, Status int) declare @table2 table (Id int, T1Id int) insert into @table1 (ID,Status) values (1,1), (2,2) insert into @table2 (Id, T1Id) values (1,1)作为表 1 和 2,第一个查询产生 2 行。第二个产生 1。 -
@AthanasiosKataras - 这是因为您使用的是 LEFT JOIN。第一个查询将返回表 2 中没有的具有 NULL 值的行。第二个查询将不返回这些行。如果是 INNER JOIN,它们本质上是相同的查询。
-
我知道我编写查询的方式会首先带来空值,但它们最终会被 where 子句过滤掉,有效地返回相同的结果。我希望查询计划能够解决这个问题并产生相同的计划。
标签: sql-server query-optimization database-performance