1. 程式人生 > >正確認識SQL Server中的模糊查詢LIKE

正確認識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_name index_description index_keys
IX_EmailAddress_EmailAddress nonclustered located on PRIMARY EmailAddress
PK_EmailAddress_BusinessEntityID_EmailAddressID clustered, unique, primary key located on PRIMARY BusinessEntityID, 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%的格式,同時建立有效的非聚集索引。

參考資料