【问题标题】:Standardizing column values takes long time. How to optimize the process?标准化列值需要很长时间。如何优化流程?
【发布时间】:2018-05-24 15:22:12
【问题描述】:

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

STANDARDISATION 表 有大约 400 个值,所以根据我下面的过程,来自 ABC 的每个 col_value 被检查 400 次以替换无效值,然后为一个 col_value 运行 1 个更新语句。

这对我有用,但需要的时间比预期的要多。 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

【问题讨论】:

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


    【解决方案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 + '%'
    

    【讨论】:

    • 我想到了这个选项来限制只有具有无效值的行的替换和更新。但是在您的情况下,我们需要为每个替换运行更新语句。无论如何,让我试试这个选项,看看需要多长时间才能完成。谢谢人
    • 嗯,是的,在这种情况下,您正在运行 400 次更新。但是在前一个版本中,您正在运行 21K 更新 - 每行一个,在这个版本中,您执行的替换操作要少得多。如果 like 子句不是太慢,那么我认为这应该更快 - 无论如何都值得尝试。
    猜你喜欢
    • 2017-10-06
    • 1970-01-01
    • 2023-03-12
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    相关资源
    最近更新 更多