哪个查询具有更好的性能 - where子句与case语句?

时间:2012-09-27 16:28:06

标签: sql-server-2008

Cars是一个包含CarType列的表。 CarType非空,可包含2个值。 CarDonated和CarSold。

我们从报表传递参数以包含所有CarTypes或特定CarType(例如CarDonated)。

方案1中的参数既可以传入'Car'(适用于所有CarTypes),也可以传递CarDonated的'CarD',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)

2 个答案:

答案 0 :(得分:1)

第一个可能略好一些,因为CarType like @CarTypeParam + '%'至少可以对CarType上的索引进行范围搜索,而CASE表达式完全无法查找。

只有50%的选择性,无论如何都不可能使用索引,除非您碰巧有一个包含查询中所有列的前导列CarType

答案 1 :(得分:1)

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