SQL Server字符替换大型数据集

时间:2016-11-18 15:38:35

标签: sql-server tsql replace query-performance

我正在尝试清理一个有几百万行的NVARCHAR(255)列。我想替换355问题字符列表中的任何字符(Á - > A)或删除字符。我创建了一个包含问题字符和替换字符的表。

我已经在循环批次中尝试了几种方案。我在本地开发盒上获得的最佳性能是1分钟--1.5分钟内大约50,000行。我希望能够改进这一点。新字段上没有索引。首先是连接问题字符表的CTE。

;WITH UctE ( ID, Name, [Count] ) AS (

           SELECT ID, Name, 1 AS [Count]
             FROM dbo.tableName t1
            WHERE t1.ID BETWEEN @StartAtID2 AND @EndAtID2

           UNION ALL

           SELECT UctE.ID, CONVERT( NVARCHAR(255), REPLACE( UctE.Name, cr.ProblemChar, COALESCE(  cr.ReplacementChar, '' ) ) )AS Name, [Count] + 1
             FROM UctE,
                  dbo.CharReplace cr
            WHERE cr.CharReplaceID = [Count]

        ) 
            UPDATE mp
               SET nameversioned = ucte.Name
              FROM dbo.Table1 mp
        INNER JOIN UctE
                ON UctE.Id = mp.ID
               AND ucte.[Count] = 335 
            OPTION( MAXRECURSION 0 );

另一个版本使用包含所有问题字符和替换字符的替换语句。替换(替换(替换(替换...到无限。

;WITH UctE ( ID, Name ) AS (

           SELECT ID, (SuperLongReplacestatement)
             FROM dbo.tableName t1
            WHERE t1.ID BETWEEN @StartAtID2 AND @EndAtID2

        ) 
            UPDATE mp
               SET nameversioned = ucte.Name
              FROM dbo.Table1 mp
        INNER JOIN UctE
                ON UctE.Id = mp.ID
            OPTION( MAXRECURSION 0 );

我也尝试过没有CTE,但我希望批量大小在CTE中表现更好。另外,这是我第一次发帖,所以如果我絮絮叨叨地或写得不好,请告诉我。

1 个答案:

答案 0 :(得分:0)

将您的查询分解为更多部分。

过程:

  1. 查找您要更新的每一行的关键字 - >查找包含您要替换的某个字符的所有字符串。
  2. 为你的钥匙获取字符串。
  3. 删除所有不需要的字符。
  4. 将键加入键并将清理后的字符串设置为带有乱码的列。
  5. 如果您要直接更新(并且在一个批次中),您可以长时间使用独占锁锁定您的表。

    您可以尝试一些特殊的排序规则 - 例如,使用SQL_Latin1_General_CP1251_CI_AS,您可以删除ěščřžýáíéú......以及许多其他“不需要的”字符。