0

我知道 SQL 语句的执行顺序,但我仍然想在 SQL 专家的帮助下确保一些事情。我有一个返回数千行的大 SQL 查询。这是我编写并认为它是正确的查询的最小化版本。

Select * 
from property 
inner join tenant t on (t.hproperty = p.hmy **and p.hmy = 7**)
inner join commtenant ct on ct.htenant = t.hmyperson
where 1=1

我的同事说上面的查询相当于下面的查询性能(他对此非常有信心)

Select * 
from property 
inner join tenant t on (t.hproperty = p.hmy)
inner join commtenant ct on ct.htenant = t.hmyperson
where **p.hmy = 7**

任何人都可以帮助我解释为什么上述查询不等价或等价吗?谢谢。

4

2 回答 2

2

如果您想知道两个查询是否等效,请了解如何在 SQL Server Management Studio 中查看执行计划。你可以把这两个查询放在不同的窗口,看看估计的执行计划,自己看看是否相同。

在这种情况下,它们可能是相同的。SQL 旨在成为一种描述性语言,而不是一种过程语言。也就是说,它描述了您想要的输出,但允许 SQL 引擎重写查询以尽可能高效。您拥有的两种形式描述了相同的输出。请注意,如果有 aleft outer join而不是 a inner join,那么查询会有所不同。

引擎很可能会在读取过程中读取表并过滤记录,或者使用索引进行读取。但是,关键思想是输出是相同的,并且 SQL Server 可以识别这一点。

于 2013-09-16T11:59:34.960 回答
0

“p.hmy = 7”不是连接条件,因为它只与单个表相关。因此,它实际上并不属于联接的 ON 子句。由于您没有通过将条件放在 ON 子句中来添加任何信息,因此将其放在 WHERE 子句(它真正属于其中)中不会对生成的查询计划产生任何影响。如果有疑问,请查看查询计划。

于 2013-09-16T11:44:12.983 回答