在SQL Server的SQL优化过程中,如果遇到WHERE条件中包含LIKE '%search_string%'是一件非常头痛的事情。这种情况下,一般要修改业务逻辑或改写SQL才能解决SQL执行计划走索引扫描或全表扫描的问题。最近在优化SQL语句的时候,遇到了一个很有意思的问题。某些使用LIKE '%' + @search_string + '%'(或者 LIKE @search_string)这样写法的SQL语句的执行计划居然走索引查找(Index Seek)。下面这篇文章来分析一下这个奇怪的现象。
首先,我们来看看WHERE查询条件中使用LIKE的几种情况,这些是我们对LIKE的一些常规认识:
1: LIKE 'condition%'
执行计划会走索引查找(Index Seek or Clustered Index Seek)。
2: LIKE '%condition'
执行计划会走索引扫描(Index Scan or Clustered Index Scan)或全表扫描(Table Scan)
3: LIKE '%condition%'
执行计划会走索引扫描(Index Scan or Clustered Index Scan)或全表扫描(Table Scan)
4: LIKE 'condition1%condition%';
执行计划会走索引查找(Index Seek)
下面我们以AdventureWorks2014示例数据库为测试环境(测试环境为SQL Server 2014 SP2),测试上面四种情况,如下所示:
其实复杂的情况下,LIKE 'search_string%'也有走索引扫描(Index Scan)的情况,上面情况并不是唯一、绝对的。如下所示
在表Person.Person的 rowguid字段上创建有唯一索引AK_Person_rowguid





