【发布时间】:2021-09-08 14:56:40
【问题描述】:
我的表中有 1700 万行,其中一些在 [url] 列中包含一个 URL,我想替换所有行中 URL 的一部分。
我的表中有 800 万行需要更新。
我已经稍微优化了我的查询,批量替换了 4,000 个,但仍然需要很长时间:
declare @Rows INT,
@BatchSize INT;
SET @BatchSize = 4000;
SET @Rows = @BatchSize; -- initialize just to enter the loop
while (@Rows = @BatchSize)
BEGIN
UPDATE TOP (@BatchSize) [dbo].[table]
SET
[url] = replace([url],
'?sv=2019-12-12&foo=bar',
'?sv=2020-02-10&bar=foo')
where [url] like '%foo=bar'
END;
您知道我可以如何改进这项任务吗?
【问题讨论】:
-
分页有帮助,因为只有 4K 行被写入事务日志。这个查询仍然很慢,因为它一遍又一遍地搜索表以寻找匹配项,每次迭代都会变慢,因为查询必须跳过更多被替换的行。将匹配的 ID/主键值提取到临时表中,并使用这些 ID 进行分页。
-
这似乎是个好主意,您介意写一个答案,这样我就可以尝试并接受您的消息,如果可行的话?
标签: sql sql-server optimization