标准化列值需要很长时间。如何优化流程?

时间:2017-12-11 06:00:47

标签: sql sql-server sql-server-2008 sql-server-2005 sql-server-2012

我正在尝试标准化表 ABC 中的列值。如果字符串中与 STANDARD_VALUE_TABLE表中的INVALID列值匹配的部分,则要替换相应的有效值。

标准化表有大约400个值,因此根据我的下面的过程,检查来自ABC的每个col_value 400次以替换无效值,之后1个更新语句运行一个col_value。

这适用于我,但需要的时间超过预期。 21K记录大约需要30分钟。

有人可以提出另一种方法来改善表现吗?

set updated_col_value_v =''
DECLARE COL_VALUE_CURSOR CURSOR for
select col_value from ABC
fetch next from COL_VALUE_CURSOR into @Col_value_variable
while @@FETCH_STATUS = 0
     begin
     DECLARE Fuzzy_invalid_value_cursor CURSOR FOR
     SELECT INVALID_VALUES FROM STANDARD_VALUE_TABLE
     fetch next from Fuzzy_invalid_value_cursor into @invalid_value_variable
     WHILE @@FETCH_STATUS = 0
           Begin
           select @Char_to_replace = VALID_VALUES  from STANDARD_VALUE_TABLE where INVALID_VALUES=@invalid_value_variable
           if @updated_col_value_v=''
           set @replaced_value = replace(@Col_value_variable,@invalid_value_variable,@Char_to_replace) 
           else
           set @replaced_value = replace(@updated_col_value_v,@invalid_value_variable,@Char_to_replace)

           set @updated_col_value_v = @replaced_value

           fetch next from Fuzzy_invalid_value_cursor into @invalid_value_variable
           end
    update ABC set updated_col_value=@updated_col_value_v where col_value=@Col_value_variable

     close Fuzzy_invalid_value_cursor
     deallocate Fuzzy_invalid_value_cursor

fetch next from COL_VALUE_CURSOR into @Col_value_variable
End
close COL_VALUE_CURSOR
deallocate COL_VALUE_CURSOR

1 个答案:

答案 0 :(得分:1)

我会尝试摆脱外部光标。不是一次更新一行,而是全部400次替换,而是每次替换一次,并更新所有需要它的行。您的无效值表有多安全?如果你不需要担心sql注入,我会在Fuzzy_Invalid-Value_Cursor中使用类似下面的东西 - 你只是更新具有特定无效值的行,但是你要做所有这些行立刻。是的,您可能会多次更新某些行,但您可能也会完全跳过其中一些行,这取决于数据,而您只是对实际需要它的行执行替换功能。

Update ABC Set Col_Value = replace(Col_Value,@invalid_value_variable,@Char_to_replace)
Where Col_Value like '%' + @invalid_value_variable + '%'