我有一个相对简单的查询连接两个表。 <!> quot; Where <!> quot;条件可以在连接标准中表示,也可以表示为where子句。我想知道哪个更有效率。

查询是查找销售员从最初晋升到销售人员的最大销售额。

案例1

select salesman.salesmanid, max(sales.quantity)
from salesman
inner join sales  on salesman.salesmanid =sales.salesmanid 
                  and sales.salesdate < salesman.promotiondate
group by salesman.salesmanid 

案例2

select salesman.salesmanid, max(sales.quantity)
from salesman
inner join sales  on salesman.salesmanid =sales.salesmanid 
where sales.salesdate < salesman.promotiondate
group by salesman.salesmanid 

注意案例1完全没有where子句

RDBMS是Sql Server 2005

修改 如果第二部分连接条件或where子句是sales.salesdate <!> lt;一些固定的日期,所以实际上没有任何加入这两个表的标准会改变答案。

有帮助吗?

解决方案

我不会在这里使用性能作为决定因素 - 老实说,我认为这两种情况之间没有任何可衡量的性能差异,实际上。

我会一直使用案例#2 - 为什么?因为在我看来,你应该只将在两个表之间建立JOIN的实际标准放入JOIN子句中 - 其他一切都属于WHERE子句。

只需要保持清洁,把东西放在他们所属的地方,IMO。

显然,有些LEFT OUTER JOIN的情况下,标准的放置确实会对返回的结果产生影响 - 当然,这些情况会从我的建议中排除。

马克

其他提示

在我通知之前,我想最后说一句话,那之前.. 两种方式可以提供相同的性能或使用的条件子句可能会在某些答案中找到更快的速度。

但我发现了一个区别,你可以用它来满足你的逻辑需求..

  1. 使用 ON 子句中的条件不会过滤/跳过要选择的行,而是根据条件将连接列设为空

  2. 使用 Where 子句中的条件可以过滤/跳过整个结果中的行

我认为你不会找到适用于所有情况的有限答案。 2并不总是可以互换的 - 因为对于某些查询(一些左连接),您将通过将标准放在WHERE与FROM行中来得出不同的结果。

在您的情况下,您应该评估这两个查询。在SSMS中,您可以查看这两个查询的估计和实际执行计划 - 这将是确定哪个更优化的良好的第一步。你也可以查看时间<!> amp;每个IO(设置统计时间,设置统计信息) - 这也将为您提供决策信息。

如果您的问题中存在查询 - 我敢打赌他们都会提出相同的查询计划 - 所以在这种情况下它可能并不重要,但在其他情况下它可能产生不同的计划。 / p>

试试这个以查看2 ...

之间的区别
SET STATISTICS IO ON
SET STATISTICS TIME ON

select salesman.salesmanid, 
       max(sales.quantity)
from   salesmaninner join sales on salesman.salesmanid =sales.salesmanid
       and sales.salesdate < salesman.promotiondate
group by salesman.salesmanid

select salesman.salesmanid, 
       max(sales.quantity)
from   salesmaninner join sales on salesman.salesmanid = sales.salesmanid 
where  sales.salesdate < salesman.promotiondate
group by salesman.salesmanid

SET STATISTICS TIME OFF
SET STATISTICS IO OFF

这可能看起来很轻浮,但答案是查询分析器为哪个查询生成最有效的计划。

在我看来,它们似乎是等价的,因此查询分析器可能会生成相同的计划,但您必须进行测试。

熟悉SQL Management Studio中的估计执行计划!!就像其他人所说的那样,无论你做什么,你都会受到分析仪的支配,所以相信它的估计。我猜你提供的两个会产生完全相同的计划。

如果是改变发展文化的尝试,那就选择能给你更好的计划;对于相同的,遵循文化

我在其他<!> quot;效率<!>上对此进行了评论。像这样的帖子(这是真诚的和讽刺的) - 如果这是你的瓶颈所在,那么对你和你的团队来说是高五。

案例1(JOIN中的条件)更适合封装,增加封装通常是一件好事:减少复制/粘贴遗漏到另一个查询,如果以后转换为LEFT JOIN减少错误,并增加可读性(相关的东西在一起)在WHERE子句中少了<!> quot; noise <!>“;在这种情况下,WHERE子句仅捕获跨多个表的主表标准或条件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top