我有一个这样的查询:
select top(10) * from dbo.myTable where DisplayName like 'farm%'
这会导致在 DisplayName 上进行索引查找,因为通配符在尾随。但是,当我这样做时,情况并非如此:
declare @val varchar(200) = 'farm'
select top(10) * from dbo.myTable where DisplayName like @val + '%'
或这个:
declare @val varchar(200) = 'farm%'
select top(10) * from dbo.myTable where DisplayName like @val
在这些情况下,SQL 会依靠慢得多的索引扫描操作。定位的值是在运行时提供的参数,因此显然我不能仅将第一个查询用于我的目的。
有什么办法可以:
- 确保 SQL 索引寻找该值,并且
- 将此逻辑存储在预编译的存储过程中。查询需要快速,所以我不想求助于每次执行都会强制重新编译的方法(即使编译开销 + 索引查找仍然比索引扫描快)
我意识到通配符的存在或不存在会影响执行计划,但 SQL 似乎并不理解通配符总是被使用,即使你将它连接到值,如查询 #2。