2016-11-18 48 views
3

我试图清理一个有数百万行的NVARCHAR(255)列。我想替换355问题字符列表中的任何字符(Á - > A)或删除字符。我创建了一个包含问题字符和替换字符的表格。在大型数据集上替换SQL Server字符

我已经尝试了几个场景,所有环状批次。我在本地开发箱上获得的最佳性能是1分钟内约50,000行 - 1.5分钟。我希望能够改善这一点。新领域没有索引。首先是加入问题字符表的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更好的表现。此外,这是我的第一次一次发贴,所以如果我天马行空或写得不好这一点,请让我知道

+0

你不应该*更新*大表。加载数据时应该发生这种替换。 –

+0

有多少数据需要更改?您可以使用INSERT语句将所有数据复制到新表中,然后在该表与原始表之间切换分区。分区切换几乎是瞬间的。这是ETL作业中的常用技巧 –

+0

此外,为什么这些字符被认为是有问题的?他们只是人物。也许你有转换问题吗?替换有效的字符不是一个好主意。无论在哪里,最好修复转换问题 –

回答

0

分解你的查询到更多部分

过程:。

  1. 的每一行查找键你会喜欢更新 - >查找所有包含您想要替换的角色的字符串。
  2. 获取您的密钥的字符串。
  3. 删除所有你不想要的字符。
  4. 加入键的关键和设置你清理的字符串与杂乱的刺中列。

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

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

+0

我尝试了一种方法,即在发生问题字符时加入表格,但整理成本正在通过屋顶。 – jmhill

+0

是的,您必须将流程“getwrongdata”和“setcorrecteddata”分开。通过整理尝试魔术或添加一些错误数据的例子。 – Deadsheep39