Levenshtein 거리를 사용하여 사용자가 입력 한 것과 가장 가까운 결과를 결정하는 저장 프로 시저가 있습니다. 속도에 실제로 영향을 미치는 유일한 함수는 가장 가까운 거리의 레코드를 선택하기 전에 모든 레코드의 Levenshtein 거리를 계산하는 함수입니다 (필자는 Levenshtein 함수를 호출하는 대신 0을 넣어 검증했습니다). 테이블에는 150 만 개의 레코드가 있으므로 약간의 조정조차 몇 초 정도면 쓸 수 있습니다. 지금은 전체가 10 분 이상 실행됩니다. 사용 방법은 다음과 같습니다.Levenshtein 거리 알고리즘 최적화
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, @[email protected], 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, @[email protected]+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
여기서부터해야 할 부분은 무엇입니까?
아직 프로파일을 작성하고 색인을 보았습니까? – Rick
계산 된 값을 각 행에 저장하고 대상 열이 chnaged 일 경우 업데이트하십시오. –
아니요 프로파일을 작성하지 않았습니다 ...이를 수행하는 방법을 찾아야합니다. 이것이 처음입니다. 저장 프로 시저를 전에 최적화하려고했습니다. 계산 된 값을 저장할 수 없습니다.이 값은 검색에 사용되며 검색 입력은 거의 반복되지 않습니다. – Matt