通常以Adventure Works數據庫作爲例子開始。我將討論利用索引查找的完全匹配,完全符合索引掃描的匹配和全文索引,您可以在其中進行完全匹配,從而實現查找。
Person.Person表具有與您的示例類似的最後名字和名字。我只保留業務ID的主鍵,並在(last,first)上創建一個索引。
--
-- Just PK & One index for test
--
-- Sample database
use [AdventureWorks2012];
go
-- add the index
CREATE NONCLUSTERED INDEX [IX_Person_LastName_FirstName] ON [Person].[Person]
(
[LastName] ASC,
[FirstName] ASC
);
go
用通配符運行不精確匹配。只需運行文本即可完全匹配。我從Person.Person表中隨機挑選了兩個名字。
--
-- Run for match type
--
-- Sample database
use [AdventureWorks2012];
go
-- remove temp table
drop table #inquiry;
go
-- A table with first, last name combos to search
create table #inquiry
(
first_name varchar(50),
last_name varchar(50)
);
go
-- Add two person.person names
insert into #inquiry values
('%Cristian%', '%Petculescu%'),
('%John%', '%Kane%');
/*
('Cristian', 'Petculescu'),
('John', 'Kane');
*/
go
-- Show search values
select * from #inquiry;
go
檢查運行時間的下一步是清除過程高速緩存和內存緩衝區。您不希望現有計劃或數據扭曲數字。
-- Remove clean buffers & clear plan cache
CHECKPOINT
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
GO
-- Show time & i/o
SET STATISTICS TIME ON
SET STATISTICS IO ON
GO
第一條SQL語句將在臨時搜索值表和Person.Person之間進行內部連接。
-- Exact match
select *
from
[Person].[Person] p join #inquiry i
on p.FirstName = i.first_name and p.LastName = i.last_name
統計和運行時間。
表'人'。掃描計數2,邏輯讀取16,物理讀取8,CPU時間= 0毫秒,經過時間= 29毫秒。
生成的查詢計劃執行#inquiry表的表掃描以及對最後名字和名字索引的索引查找。這是一個很好的簡單計劃。

讓使用通配符LIKE操作一個不完全匹配,然後重試這個。
-- In-Exact match
select *
from
[Person].[Person] p join #inquiry i
on p.FirstName like i.first_name and p.LastName like i.last_name
統計和運行時間。
表'人'。掃描計數2,邏輯讀取219,CPU時間= 32毫秒,經過時間= 58毫秒。
生成的查詢計劃是一種複雜得多。由於沒有索引,我們仍在對#查詢進行表格掃描。但是,有很多嵌套連接繼續使用索引進行公平匹配。
我們增加了三個運營商查詢和執行時間的兩倍完全匹配的。

總之,如果你正在做與LIKE命令不精確的比賽中,他們會更昂貴。
如果您正在尋找成千上萬的記錄,使用全文索引(FTI)。我寫了兩篇關於這個話題的文章。
http://craftydba.com/?p=1629
每天晚上,你必須有一個過程,有任何的更改來更新FTI。在這一擊之後,您可以使用CONTAINS()運算符來利用模糊匹配中的索引。
我希望我解釋的差異。我已經看到了這個話題持續的困惑,我想在Stack Overflow上寫一些我可以參考的東西。
祝您好運娟。
你沒有在所有的「循環」 – 2014-10-03 02:05:17
你的問題是不明確的解釋。 – 2014-10-03 02:09:42