【发布时间】: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