我正在尝试清理一个有几百万行的NVARCHAR(255)列。我想要替换我的355问题字符列表中的任何字符(α-> A),或者删除该字符。我已经创建了一个包含问题字符和替换字符的表。
我已经尝试了几个场景,都是循环批处理的。我在本地的dev box上得到的最好的性能是在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...to无穷大。
;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中会表现得更好。另外,这是我第一次发帖,所以如果我漫无边际地写了这篇文章,请让我知道。
发布于 2016-11-18 16:16:03
将您的查询分解为更多部分。
进程:
如果您将直接更新(并且是在一个批处理中),那么您可以使用排它锁长时间地锁定您的表。
您可以尝试一些特殊的排序规则-例如,使用SQL_Latin1_General_CP1251_CI_AS,您可以删除ěščřžAyaniééuů和许多其他“不需要的”字符。
https://stackoverflow.com/questions/40680917
复制