我正在尝试清理一个有几百万行的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中表现更好。另外,这是我第一次发帖,所以如果我絮絮叨叨地或写得不好,请告诉我。
答案 0 :(得分:0)
将您的查询分解为更多部分。
过程:
如果您要直接更新(并且在一个批次中),您可以长时间使用独占锁锁定您的表。
您可以尝试一些特殊的排序规则 - 例如,使用SQL_Latin1_General_CP1251_CI_AS,您可以删除ěščřžýáíéú......以及许多其他“不需要的”字符。