如果我多次指定过滤器,性能会更好吗?

ado*_*lot 2 performance join sql-server sql-server-2008-r2

如果我在 a 的WHERE两边重复子句中的过滤器,我会获得更高的性能OUTER JOIN吗?

要澄清使用代码:

select * 
from #main_select
left outer join 
(
  select 
    main_id 
   ,sum(aggregated) as agg
  from #left_table 
  group by main_id
) as grouped 
on #main_select.id=grouped.main_id
where #main_select.id = 1

--same reuslts

select * 
from #main_select
left outer join 
(
  select 
    main_id 
   ,sum(aggregated) as agg
  from #left_table 
  where main_id=1 -- in this case I added where same as Left outer join
  group by main_id
) as grouped 
on #main_select.id=grouped.main_id
where #main_select.id = 1
Run Code Online (Sandbox Code Playgroud)

Seb*_*ine 5

一般不会有什么区别。SQL 是一种声明性语言,它被查询优化器翻译成“执行计划”。优化器的目标是提供最佳执行计划,以产生查询中要求的结果。这意味着两个逻辑上等效的查询应始终生成相同的执行计划。

理论到此为止。然而,在实践中,有很多方法可以为即使是中等复杂的查询构建执行计划。(例如,请参阅我的回答:https : //stackoverflow.com/questions/16974241/sql-server-join-selects-slower-than-join-select-with-local-table/16974641#16974641)这意味着相反以最佳计划为目标,优化器只能以足够好的计划为目标。优化器甚至考虑的计划是根据一组规则和启发式选择的,并且肯定会受到原始查询的影响。

在 SQL Server 2000 中,许多性能优化策略都是围绕通过将查询重写为另一种逻辑等效形式来帮助优化器从更好的计划集开始构建的。自 SQL 2005 以来,优化器不再需要这种形式的帮助,但仍有一些查询可以从重写中受益。

因此,为了回答您的问题,如果您观察到通过在连接条件中提供额外的“提示”来加快查询速度,则上述内容应该给您一个解释。一般来说,在尝试优化查询时,这不是首先要考虑的事情。

相反,您应该首先确保您的表被正确索引并且所有统计信息都是最新的。