0

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

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

场景 1 中的参数传入“Car”(对于所有 CarTypes)、“CarD”用于 CarDonated、“CarS”用于 CarSold。

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

或者

场景 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)

4

2 回答 2

2

第一个可能稍微好一点,因为CarType like @CarTypeParam + '%'至少可以对索引进行范围搜索,CarTypeCASE表达式完全不可分割。

如果只有 50% 的选择性,则无论如何都不太可能使用索引,除非您碰巧有一个索引,其前导列CarType覆盖了查询中的所有列。

于 2012-09-27T16:31:49.553 回答
1

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

于 2012-09-27T16:51:20.347 回答