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)
答案 0 :(得分:1)
第一个可能略好一些,因为CarType like @CarTypeParam + '%'
至少可以对CarType
上的索引进行范围搜索,而CASE
表达式完全无法查找。
只有50%的选择性,无论如何都不可能使用索引,除非您碰巧有一个包含查询中所有列的前导列CarType
。
答案 1 :(得分:1)
Gabe - 确定这一点的最佳方法是亲自测试。查看为两者生成的查询计划,并确保至少两个查询都在进行搜索而不是扫描。然后,我将在使用Profiler监视服务器时运行这些查询,以检查每个正在执行的读取次数,以及可能使用更多整体资源的读取次数。对于您正在撰写的任何疑问,这都是合理的建议。