【问题标题】:SQL Performance (Replace)SQL 性能(替换)
【发布时间】:2011-04-07 10:11:44
【问题描述】:

我有一个大约有 400,000 多行的表。我正在编写一些模式匹配代码,但在这样做之前需要清理一列。这归结为进行类似替换的操作。

我尝试一次将它们全部列出...

 Update T_ADDRESS set ADDR_LINEONE = REPLACE(ADDR_LINEONE,' southeast ',' se ')
 Update T_ADDRESS set ADDR_LINEONE = REPLACE(ADDR_LINEONE,' southwest ',' sw ')

因为我有超过 500 个这样的...花了太长时间。

现在我正在尝试嵌套它们...

 Update T_ADDRESS set ADDR_LINEONE = REPLACE(REPLACE(ADDR_LINEONE,' southwest ',' sw '),' southeast ',' se ')

但这仍然非常缓慢。我需要使此代码适用于各种大小的表(1 条记录到 500 万条记录)。

有人有什么建议吗?顺便说一句,我正在使用 SQL Server。

【问题讨论】:

    标签: sql database sql-server-2005 replace


    【解决方案1】:

    无论您如何执行 REPLACE,您都必须始终对表进行端到端扫描。这就是扼杀性能的原因,并且无法更改,因为您必须以任何合理的方式索引 ADDR_LINEONE 字段。

    由于这应该是一次性操作,所以时间长并不重要。

    如果这是重复操作,那么您的问题不在这里,而在于如何将数据加载到表中:在保存数据之前进行转换,否则您将没有机会。

    【讨论】:

      【解决方案2】:

      编写一个 CLR 过程。 TSQL 不擅长(或设计用于)处理大量字符串操作。

      Regular Expressions Make Pattern Matching And Data Extraction Easier

      【讨论】:

        【解决方案3】:

        使用新值创建 #TEMP 表,然后进行内部连接 像这样的

        create table #TempValues
        (oldAres varchar(12),newadres varchar(2))
        
        insert into #TempValues
        select 'southeast','se'
        union all 
        select 'southwest','sw'
        
        update T_ADDRESS
        set addr_lineone=t.newadres
        from T_ADDRESS inner join #TempValues t on T_ADDRESS.addr_lineone=t.oldAdres
        

        【讨论】:

          【解决方案4】:

          您可以编写更新语句以使用 CASE 语句代替多个 REPLACE,尽管我不知道这是否会为您更快地执行。

          【讨论】:

            【解决方案5】:

            老问题,但仍然有用。 您的查询会更新表的所有列,如果该列被索引,则会有很大的损失。 您可以通过过滤不需要更新的字段来提高速度,如下所示:

            Update T set ADDR_LINEONE = REPLACE(ADDR_LINEONE,' southeast ',' se ') FROM T_ADDRESS T WHERE ADDR_LINEONE LIKE '% southeast %'
            Update T set ADDR_LINEONE = REPLACE(ADDR_LINEONE,' southwest ',' sw ') FROM T_ADDRESS T WHERE ADDR_LINEONE LIKE '% southwest %'
            

            除非您的所有地址都包含东南或西南,否则这将快一个数量级!

            【讨论】:

              猜你喜欢
              • 2015-09-28
              • 1970-01-01
              • 2010-10-14
              • 1970-01-01
              • 2022-01-22
              • 2016-01-27
              • 2020-07-29
              • 1970-01-01
              • 2012-09-04
              相关资源
              最近更新 更多