执行SQL语句

时间:2013-09-16 11:30:16

标签: sql-server sql-server-2008 sql-server-2005

我知道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**

有人可以帮我解释为什么上面的查询不等同或等同吗?感谢。

2 个答案:

答案 0 :(得分:2)

如果您想知道两个查询是否相同,请了解如何查看SQL Server Management Studio中的执行计划。您可以将两个查询放在不同的窗口中,查看估计的执行计划,并查看它们是否相同。

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

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

答案 1 :(得分:0)

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