J'ai une procédure stockée qui utilise la distance de Levenshtein pour déterminer le résultat le plus proche de ce que l'utilisateur a tapé. La seule chose qui affecte vraiment la vitesse est la fonction qui calcule la distance de Levenshtein pour tous les enregistrements avant de sélectionner l'enregistrement avec la plus faible distance (j'ai vérifié cela en mettant un 0 à la place de l'appel à la fonction Levenshtein). La table a 1,5 million d'enregistrements, donc même le moindre ajustement peut raser quelques secondes. À l'heure actuelle, tout cela dure plus de 10 minutes. Voici la méthode que j'utilise:Optimisation de l'algorithme de distance de 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
Où dois-je aller?
Avez-vous déjà dressé un profil et regardé vos indices? – Rick
stocke la valeur calculée dans chaque ligne, et mise à jour si chnages de la colonne cible .... –
Non je ne l'ai pas profilé ... Je vais devoir chercher comment faire cela, c'est la première fois que j'ai essayé d'optimiser un proc stocké avant. Je ne peux pas stocker la valeur calculée, ceci est utilisé pour une recherche et les entrées sur la recherche seront rarement répétées. – Matt