正确认识SQL Server中的模糊查询LIKE

目录

SQL Server中的模糊查询LIKE

在SQL Server中,当我们想实现模糊查询时,可能我们首先想到的是使用LIKE语句,其次是使用全文搜索(即Full-Text Search),如下所示是通过LIKE语句对表Person.EmailAddress中的EmailAddress字段进行模糊查询:

--使用微软官方示例数据库AdventureWorks2008R2
SELECT  *
FROM Person.EmailAddress
WHERE EmailAddress LIKE '%mary%'

通常,当表的总记录达数十万时,LIKE的执行效率将明显下降。那么我们是否真的正确认识LIKE语句,本文将描述如何正确使用SQL Server中的LIKE语句进行模糊查询。

LIKE的匹配格式及正确使用

虽然在SQL Server中LIKE语句可使用如下4种通配符:

%
_
[]
[^]

但实际总结后,LIKE语句总共如下4种格式:

%HyperWang%
%HyperWang
HyperWang%
Hyper%Wang

注意通配符%的位置。

为了更好的理解这4种匹配格式,我们修改上述sql代码,并在执行后查看IO统计信息与实际执行计划:

--检查表中的索引情况
sp_helpindex [Person.EmailAddress]
-----------------------------------------------------------
index_nameindex_descriptionindex_keys
IX_EmailAddress_EmailAddressnonclustered located on PRIMARYEmailAddress
PK_EmailAddress_BusinessEntityID_EmailAddressIDclustered, unique, primary key located on PRIMARYBusinessEntityID, EmailAddressID

表格所示,表Person.EmailAddress中的EmailAddress建有非聚集索引。执行修改后的sql代码:

--匹配mary在中间的记录
SELECT  EmailAddress
FROM Person.EmailAddress
WHERE EmailAddress LIKE '%mary%'

--匹配mary在尾部的记录
SELECT  EmailAddress
FROM Person.EmailAddress
WHERE EmailAddress LIKE '%mary'

--匹配以mary开头的记录
SELECT EmailAddress
FROM Person.EmailAddress
WHERE EmailAddress LIKE 'mary%'

--匹配以ma开头,ry结尾的记录
SELECT  EmailAddress
FROM Person.EmailAddress
WHERE EmailAddress LIKE 'ma%ry'

其中以格式mary%的效率最好,以index seek方式使用非聚集索引IX_EmailAddress_EmailAddress(如下图所示)。
mary%

(43 row(s) affected)
表 ‘EmailAddress’。扫描计数 1,逻辑读取 3 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

%mary%mary%的效率最差,IO开销最高,且以index scan方式使用非聚集索引

(0 row(s) affected)
表 ‘EmailAddress’。扫描计数 1,逻辑读取 186 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

因此当我们使用LIKE进行模糊查询时,应尽量使用mary%格式,避免%mary%的格式,同时建立有效的非聚集索引。

参考资料

  1. LIKE (Transact-SQL)
    https://msdn.microsoft.com/en-us/library/ms179859(v=sql.105).aspx

  2. Improving SQL Server Performance
    https://msdn.microsoft.com/en-us/library/ff647793.aspx

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值