我试图清理一个有数百万行的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更好的表现。此外,这是我的第一次一次发贴,所以如果我天马行空或写得不好这一点,请让我知道
你不应该*更新*大表。加载数据时应该发生这种替换。 –
有多少数据需要更改?您可以使用INSERT语句将所有数据复制到新表中,然后在该表与原始表之间切换分区。分区切换几乎是瞬间的。这是ETL作业中的常用技巧 –
此外,为什么这些字符被认为是有问题的?他们只是人物。也许你有转换问题吗?替换有效的字符不是一个好主意。无论在哪里,最好修复转换问题 –