【问题标题】:SQL Server Character replace on large dataset大型数据集上的 SQL Server 字符替换
【发布时间】:2017-04-02 12:44:45
【问题描述】:

我正在尝试清理具有数百万行的 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 );

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

;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 中表现更好。另外,这是我第一次发帖,所以如果我写得不好或写得不好,请告诉我。

【问题讨论】:

  • 您不必更新大表。这种替换应该在加载数据时发生。
  • 需要更改的数据百分比是多少?您可以使用 INSERT 语句将所有数据复制到新表中,然后在此表和原始表之间切换分区。分区切换几乎是瞬时的。这是 ETL 作业中的常用技术
  • 另外,为什么这些字符被认为有问题?他们只是角色。您是否有转换问题?替换有效字符不是一个好主意。最好解决转换问题,无论它在哪里
  • 将更新近 100% 的行。我不确定我们现在是否可以进行分区切换。现在,我的任务是弄清楚如何在合理的时间范围内更新表格。由于业务规则,这些字符正在被删除。正在处理转换问题,但需要更改旧记录。

标签: sql-server tsql replace query-performance


【解决方案1】:

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

流程:

  1. 查找要更新的每一行的键 --> 查找包含您要替换的字符之一的所有字符串。
  2. 为您的密钥获取字符串。
  3. 删除所有不需要的字符。
  4. 将键连接到键,并将清理后的字符串设置为带有混乱刺痛的列。

如果您将直接更新(并且在一批中),您可以使用排他锁长时间锁定您的表。

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

【讨论】:

  • 我尝试了一种方法,在出现问题字符时加入表格,但整理成本正在飙升。
  • 是的,您必须将进程“getwrongdata”和“setcorrecteddata”分开。尝试使用排序规则或添加一些错误数据示例。
猜你喜欢
  • 2021-12-07
  • 2018-02-24
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多