1

Table of People (name, dob, ssn etc)
Table of NewRecords (name, dob, ssn)
I want to write a query that determines which NewRecords do not in any way match any of the People (it's an update query that sets a flag in the NewRecords table).

Specifically, I want to find the NewRecords for which the Levenshtein distance between the first name, last name and ssn is greater than 2 for all records in People. (i.e. the person has a first, last and ssn that are all different from those in People and so is likely not a match).

I added a user-defined Levensthein function Levenshtein distance in T-SQL and have already added an optimization that adds an extra parameter for maximal allowed distance. (If the calculated levenstein climbs above the max allowed, the function exits early). But the query is still taking an unacceptably long time because the tables are large.

What can I do to speed things up? How do I start thinking about optimization and performance? At what point do I need to start digging into the internals of 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 
4

3 回答 3

3

由于不确切知道表结构和数据类型,我不能 100% 确定这会奏效,但还是试试吧!

当你测试它时,我会首先检查 SQL 执行计划,通常会有一些部分会花费最多的时间。从那里你应该能够衡量哪里/是否有任何索引会有所帮助。

我的直觉是,从外观上看,您的函数被调用了很多,但希望执行计划将确定是否是这种情况。如果是,那么 CLR 存储过程可能是要走的路。

于 2013-04-29T13:53:54.030 回答
1

对于一个跳过正确的值,因此如果再次运行它,它将不会处理这些值。
那个距离是昂贵的 - 尝试首先消除那些没有机会的人。
如果长度相差超过 2,那么我认为您的距离不能 <= 2。

update NewRecords
set notmatchflag=true
from  newRecords elr
inner join People pro
  on notmatchflag = false
 and elr.ssn is null 
 and elr.dob <> ro.dob
 and dbo.Levenshtein_withThreshold( elr.last, pro.last,2) > 2  
 and dbo.Levenshtein_withThreshold(elr.first,pro.first,2) > 2 
于 2013-04-29T15:15:26.423 回答
1

您的查询似乎没有任何问题(也许除了您想要找到不同值的所有可能组合,这在大多数情况下会给出很多结果 :))。

无论如何,问题在于您的 Levenstein 函数 - 我假设它们是用 T-SQL 编写的。即使你优化了它们,它们仍然很弱。您确实应该将它们编译为 CLR(您发布的链接已经包含一个示例) - 这将快一个数量级。

我想尝试的另一个想法是,以某种方式减少 Levenstein 比较的次数。也许找到其他条件,或者反向查询:找到所有 MATCHING 记录,然后选择剩下的(它可能使您能够引入这些附加条件。

但是编译到 CLR 的 Levenstein 是您的最佳选择。

于 2013-04-29T13:54:46.047 回答