是否有人能够提供有关SQL Server能够进行哪些优化的信息?我使用的是2005年的标准版,有时也和2008年一起工作。 2008能够执行2005年不能查询的优化吗?SQL Server优化
有时候我会运行一个查询,这将需要很长时间没有明显的原因,我必须用不同的方法重写它。 (CTE而不是子查询等)我想提前知道在开始使用SQL服务器之前SQL服务器是否会为查询提供最佳或接近可选的性能。
加入到子查询
select ... from tbl1 left join(
select ... from tbl2 group by ...
) as subQ on t1.pk = subQ.fk
where t1.pk between 50 and 100
如果我加入一个表的子查询同上,结果集进行过滤,我可以期待WHERE子句中过滤下来所有 SQL服务器进行传播相关的子查询?编译器在确定结果集的哪些部分最终将用于最终输出中有多好?
很多组列由
子查询与分组依据,往往可以写成一个直线上升加盟,但随后被
select tbl1.pk,b,c,d,e,f,g, sum(tbl2.h) from tbl1
inner join tbl2 on tbl1.pk = tbl2.fk
inner join tbl3 on tbl1.fk = tbl3.pk
group by tbl1.pk, tbl1.b, tbl3.c, tbl3.d, tbl3.e, tbl3.f, tbl3.g
每个引用组中的许多列是必要的除表3中的一行外,表1中的行将与表2中的多行相匹配。(注意与表3的pk的连接)由于此原因,组中除tbl1.pk之外的所有列都是多余的。但是,SQL要求无论如何都要在组中使用它们。现在优化器应该只是在表1的主键上进行排序,以便聚合表2中的行。它会这样做,还是会不必要地对组中的整个列集进行排序和比较?如前所述,另一种方法是将表2聚合到子查询中,然后再回到表1和表3中。这是否有所不同?
谓词推送示例指示问题出现在视图中,但与表值函数不同。在这种情况下,使用(非索引)视图是否有意义?表函数似乎没有任何缺点。 – Trent 2012-03-20 13:29:11
@Trent - 您无法在TVF或呼叫端创建触发功能(例如'NEWID()')。如果你不需要那些,那么不需要。不AFAIK。 – 2012-03-20 13:38:31