淡sqlserver对like '%关键词%' 处理时的索引利用问题

说法一:百分号%通配符前置会让SQL查询不走索引,改走全表扫描。这种说法很流行

结论是错误的

事实上这种说法不太准确 通配符%前置会让SQL查找索引时效率极速下降,但在大多数情况下还是会走索引(不需要全文索引,只要建一个普通的索引就可以了)

CREATE NONCLUSTERED INDEX [Ix_索引名] ON [dbo].[wkf_表名] 
(
 [db_title]  ASC
)

此时执行

SELECT top 10 [db_id],[db_Summary],[db_AddDate],[db_title]  FROM [库名].[dbo].[wkf_database]   where [db_title]like '%dba%'  order by 1 desc
 
查询计划显示得很清楚

加普通索引后

对比加索引之前:


说一个例外,复杂查询查询优化器可能会抛弃索引改走全表扫描。这不仅是LIKE '%关键词%' 时会这样,跟查询复杂度有关

 

 


说法二:百分号%通配符前置会让SQL查询走索引不如不走索引

这种说法非常片面,走索引比不走索引99%的情况下都会减少IO从而提高效率,但是:索引查找完的键匹配动作也是有一部分性能消耗的。像上面两张图所示,如果关键字很容易就匹配到了,全表扫描很快就找齐了数据,而索引扫描节省的时间不足以弥补键匹配动作所消耗时间的时候这种情况就发生了(大部分线上查询不存在这问题)这时候优化就变得诡异了。
处理方法:
1.不去管它,多出来的性能消耗不是很大。而且不同的关键词有不同的消耗,只是部分关键词存在此问题,可以忽略
2.更好的方法,如果条件允许建覆盖索引(又叫INCLUDE索引)。前题条件:a存储空间充足,b不显著影响DML操作,c覆盖的索引中没有大字段

CREATE NONCLUSTERED INDEX [Ix_索引名] ON [dbo].[wkf_表名] 
(
 [db_title]  ASC
)
INCLUDE ( [db_id],[db_Summary],[db_AddDate])

此时执行查询计划如下,清爽多了吧

 

以上就是我现在能想到的SQLSERVER处理SELECT *  FROM TABLENAME LIKE  '%关键词%'


总结:


1.使用模糊查询最好使用后置,前置会大大降低效率。

select * from T_OMS_EMPLOYEE_BASEINFOR where usernameCn like '%肖%'

2.使用全文检索,效率远远大于like,不过具体全文检索怎么操作我还没有学习,这边就不能给我例子。 (待学习)

<think>好的,我需要解决用户的问题:在SQL Server中使用LIKE查询来匹配以A或B开头的字符串。用户想要类似A%或B%的匹配方式。首先,我应该回忆一下SQL中LIKE操作符的用法,尤其是通配符的使用。记得%代表任意多个字符,而_代表单个字符。这里用户需要的是以A或B开头,所以结构应该是字段名 LIKE 'A%'或者字段名 LIKE 'B%'。 接下来,用户希望同满足这两个条件中的任意一个,所以应该用OR连接这两个LIKE条件。例如:WHERE column LIKE 'A%' OR column LIKE 'B%'。这是基本的解决方法。不过,有没有其他方法呢?比如使用通配符更简洁的方式?例如,使用[AB]%这样的模式。因为在SQL Server中,方括号可以指定一个字符集合,匹配其中的任意一个字符。所以,'[AB]%'可以匹配以A或B开头的字符串。这样写可能更简洁,也更高效,因为只需要一个LIKE条件,而不是两个OR条件。 需要确认的是,SQL Server是否支持这种方括号的通配符。根据之前的引用内容,比如引用[3]提到LIKE支持某字开头、结尾等,虽然没有明确提到方括号,但引用[2]和[5]中的例子使用了%和多个LIKE条件,但引用[3]提到REGEXP在SQL Server中不可用。因此,方括号应该是可用的,因为这是LIKE的标准通配符之一。 所以,用户的问题有两种解决方法:使用OR连接两个LIKE条件,或者使用单个LIKE条件配合[AB]%。需要详细说明这两种方法,并给出示例。同,要指出两者的区别,比如方括号的方式更简洁,可能在性能上更优,因为只需要一次模式匹配。 另外,用户可能想知道这两种方法的性能差异,或者是否有其他注意事项。例如,使用OR可能会导致查询优化器无法有效使用索引,而使用[AB]%可能更高效,如果字段上有索引的话。但需要根据具体情况分析,可能建议用户在实际环境中测试两种方式的性能。 最后,根据用户提供的引用内容,引用[2]展示了以特定字符串开头的情况,引用[4]和[5]涉及NOT LIKE和多个条件的组合,可以引用这些来支持回答的正确性。比如,引用[2]中的例子使用'friedb%'来匹配以friedb开头的地址,说明%的正确用法,而引用[5]展示了多个OR条件的组合,可以用来支持使用OR的解决方案。 总结回答的结构应该是:首先介绍使用OR的方法,给出示例;然后介绍使用方括号的方法,给出示例;比较两者的优缺点;最后引用相关的参考资料来支持回答的正确性。</think>在SQL Server中,使用`LIKE`查询匹配以**A**或**B**开头的字符串,可以通过以下两种方式实现: ### 方法1:使用`OR`连接多个条件 通过`OR`运算符将两个`LIKE`条件组合,分别匹配以**A**开头和以**B**开头的字符串。 示例: ```sql SELECT * FROM 表名 WHERE 列名 LIKE 'A%' OR 列名 LIKE 'B%'; ``` 此方法逻辑清晰,但若需要匹配更多前缀(如**C**、**D**等),需重复添加`OR`条件。 --- ### 方法2:使用通配符`[ ]`指定字符范围 通过`[AB]%`匹配第一个字符为**A**或**B**的字符串,`%`表示后续任意字符。 示例: ```sql SELECT * FROM 表名 WHERE 列名 LIKE '[AB]%'; ``` 此方法更简洁且可扩展性强,适合匹配固定范围内的首字符[^3]。 --- ### 两种方法的对比 1. **性能**:若字段已建立索引,`[AB]%`可能更高效,因为仅需一次索引扫描;而`OR`可能导致多次扫描。 2. **可读性**:`[ ]`语法更紧凑,适合少量字符匹配;`OR`更直观,适合复杂条件组合。 3. **扩展性**:若需匹配更多前缀(如**A**-**E**),可简化为`[A-E]%`[^2]。 --- ### 实际应用示例 假设查询`People`表中`Address`以**A**或**B**开头的数据: ```sql SELECT Id, Name, Address FROM People WHERE Address LIKE '[AB]%'; ``` ### 注意事项 - 若需排除某些前缀(如不以**A**或**B**开头),可使用`NOT LIKE '[AB]%'`[^4]。 - 复杂逻辑(如多字段组合匹配)建议结合`AND`/`OR`运算符[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值