【发布时间】:2010-05-27 05:54:19
【问题描述】:
我有一个存储过程,它使用 Levenshtein 距离来确定最接近用户键入的结果。唯一真正影响速度的是在选择具有最短距离的记录之前计算所有记录的 Levenshtein 距离的函数(我通过将 0 代替对 Levenshtein 函数的调用来验证这一点)。该表有 150 万条记录,因此即使是最轻微的调整也可能会缩短几秒钟。现在整个事情运行了10多分钟。这是我正在使用的方法:
ALTER function dbo.Levenshtein
(
@Source nvarchar(200),
@Target nvarchar(200)
)
RETURNS int
AS
BEGIN
DECLARE @Source_len int, @Target_len int, @i int, @j int, @Source_char nchar, @Dist int, @Dist_temp int, @Distv0 varbinary(8000), @Distv1 varbinary(8000)
SELECT @Source_len = LEN(@Source), @Target_len = LEN(@Target), @Distv1 = 0x0000, @j = 1, @i = 1, @Dist = 0
WHILE @j <= @Target_len
BEGIN
SELECT @Distv1 = @Distv1 + CAST(@j AS binary(2)), @j = @j + 1
END
WHILE @i <= @Source_len
BEGIN
SELECT @Source_char = SUBSTRING(@Source, @i, 1), @Dist = @i, @Distv0 = CAST(@i AS binary(2)), @j = 1
WHILE @j <= @Target_len
BEGIN
SET @Dist = @Dist + 1
SET @Dist_temp = CAST(SUBSTRING(@Distv1, @j+@j-1, 2) AS int) +
CASE WHEN @Source_char = SUBSTRING(@Target, @j, 1) THEN 0 ELSE 1 END
IF @Dist > @Dist_temp
BEGIN
SET @Dist = @Dist_temp
END
SET @Dist_temp = CAST(SUBSTRING(@Distv1, @j+@j+1, 2) AS int)+1
IF @Dist > @Dist_temp SET @Dist = @Dist_temp
BEGIN
SELECT @Distv0 = @Distv0 + CAST(@Dist AS binary(2)), @j = @j + 1
END
END
SELECT @Distv1 = @Distv0, @i = @i + 1
END
RETURN @Dist
END
我应该从这里去哪里?
【问题讨论】:
-
您是否已经对此进行了分析并查看了您的索引?
-
将计算值存储在每一行中,如果目标列发生变化则更新......
-
不,我没有对其进行分析...我将不得不查找如何做到这一点,这是我第一次尝试优化存储过程。我无法存储计算的值,这是用于搜索的,搜索中的输入很少会重复。
标签: optimization levenshtein-distance edit-distance