表的人(姓名,出生日期,身份證等)
表NewRecords(姓名,出生日期,SSN)
我想寫的是確定哪些NewRecords查詢不以任何方式匹配任何人(這是一個更新查詢,在NewRecords表中設置了一個標誌)。如何加快這個T-SQL查詢
具體來說,我想找到NewRecords爲它的第一個名字,姓氏和SSN之間的Levenshtein距離是大於2的所有記錄在人。 (即該人具有與人中所有人不同的第一個,最後一個和ssn,因此可能不匹配)。
我添加了一個用戶定義的Levensthein函數Levenshtein distance in T-SQL並且已經添加了一個優化,爲最大允許距離添加了一個額外的參數。 (如果計算的levenstein爬升到允許的最大值以上,該函數會提前退出)。但由於表格很大,查詢仍然需要很長的時間。
我能做些什麼來加快速度?我如何開始考慮優化和性能?在什麼時候我需要開始挖掘SQL Server的內部?
update NewRecords
set notmatchflag=true
from
newRecords elr
inner join People pro
on
dbo.Levenshtein_withThreshold(elr.last,pro.last,2)>2 and
dbo.Levenshtein_withThreshold(elr.first,pro.first,2)>2 and
elr.ssn is null and
elr.dob<>pro.dob
執行計劃? – Kermit 2013-04-29 13:49:47
你有沒有試過C#CLR存儲過程?這些字符串操作比SQL用戶定義的函數要好得多。 – Andomar 2013-04-29 13:53:12
Scalar UDF在SQL Server上的性能令人失望。再加上搜索子句中的大部分函數和表達式都會阻止它能夠使用該部分搜索的索引。如果您向我們展示您的UDf的代碼,我們可能會將其轉化爲可以更好地優化的東西。 – RBarryYoung 2013-04-29 13:57:45