2012-09-27 41 views
0

汽车是一个有CarType列的表。 CarType非空,可以包含2个值。 CarDonated和CarSold。哪个查询具有更好的性能 - 带有case语句的where子句?

我们从报告中传入参数以包含所有CarTypes或特定CarType(如CarDonated)。

方案1中的参数传入'Car'(对于所有CarTypes),'CarD'对于CarDonated,对于CarSold'CarS'。

select * 
from Cars c 
where c.CarType like @CarTypeParam + '%' 

OR

参数表示脚本2道次在 '0'(对于所有CarTypes), 'CarDonated', 'CarSold'

select * 
from Cars c 
where c.CarType = case when @CarTypeParam = '0' 
        then c.CarType 
        else @CarTypeParam 
        end 

哪个场景/编码方法更好?我不太熟悉where子句中的case语句。在这两种情况下,优化器是否仍然能够在CarType上使用索引?哪个编码更好?

的SQL Server 2008 R2(与沿SSRS)

回答

1

第一个是作为潜在CarType like @CarTypeParam + '%'稍好至少可以做的范围上CarType索引查找而CASE表达是完全unsargable。

只有50%的选择性,索引不太可能被使用,尽管除非您碰巧有一个索引包含查询中所有列的前导列CarType

+1

目前CASE也不会工作,因为它测试c.CarType +'%'的相等性,而不是使用LIKE –

+0

@AlexK。 ,哎呀,这是一个错字。应该只是“c.CarType”。固定。 – Gabe

+0

@MartinSmith,如果CarType上没有索引,那么两者之间的性能会有很大差异吗? – Gabe

1

Gabe - 确定这个最好的方法是自己测试一下。查看为两者生成的查询计划,并确保至少两个查询都在进行搜索而不是扫描。然后,我会在使用Profiler监视服务器时运行这些查询,以检查每个正在执行的读取次数,以及哪些可能会使用更多的整体资源。对于您正在编写的任何查询来说,这都是很好的建议