【发布时间】:2020-09-01 03:37:40
【问题描述】:
我正在更新一个有 3300 万行的表中的 varchar 列。这就是我想出的,脚本在我的开发机器上大约需要 50 分钟。有什么办法可以提高性能?
SET XACT_ABORT ON
DECLARE @NewPrefix VARCHAR(255)
,@OldPrefix VARCHAR(255)
,@Rowcount BIGINT = 1
,@BatchSize INT = 100000
,@ModBy VARCHAR(50)
,@ModStation VARCHAR(50)
,@UpdatedCount BIGINT = 0;
SET @ModBy = 'User1'
SET @ModStation = 'abc001'
SET @OldPrefix = 'http://OldPrefix/'
SET @NewPrefix = 'http://NewPrefix/'
WHILE (@Rowcount > 0)
BEGIN
BEGIN TRANSACTION
UPDATE TOP (@BatchSize) tblFiles
SET FileLocation = REPLACE(FileLocation, @OldPrefix, @NewPrefix),
ModDate = GETDATE(),
ModBy = @ModBy,
ModStation = @ModStation
WHERE ModStation <> @ModStation
AND FileLocation IS NOT NULL
SET @Rowcount = @@ROWCOUNT;
SET @UpdatedCount = @UpdatedCount + @Rowcount
COMMIT TRANSACTION
END
SELECT @UpdatedCount AS 'Records Updated.'
谢谢!
【问题讨论】:
-
您的表中有
(ModStation)(或(ModStation, FileLocation))的索引吗?这至少会加速要更新的行的“发现” -
匹配
WHERE ModStation <> @ModStation AND FileLocation IS NOT NULL的行中有多少包含您要替换的前缀?他们都是?如果不是什么比例? -
2600万符合条件FileLocation IS NOT NULL
-
@marc_s - 不,我在这些表上没有任何索引。
标签: sql-server sql-server-2017