由于资源限制,我在将数据从具有 600 万行的表迁移到 SQL Server 数据库中的另一个表时遇到困难。数据库相对较小,当我一次发送 100,000 行时,DTU 使用率飙升至 100%,这会影响系统的性能和稳定性。
我尝试了多种迁移方法,包括:
然而,所有这些方法都导致了数据库过载,并且未能有效地实现平滑迁移。
在不导致数据库资源利用率过高的情况下迁移大量数据的最佳实践或技术是什么?是否有一种有效的方法可以将迁移分解为更小的步骤,而不会使处理花费太多时间,或者优化流程以最大程度地减少对数据库的影响?
您可以尝试以下概念示例。
它将从 SQL Server 2012 开始工作。
它正在使用
OFFSET
/ FETCH
,即分页功能。
唯一需要手动指定的参数是
@NumberOfBatchesTotal
。
SQL
-- DDL and data population, start
DECLARE @source TABLE (ID INT PRIMARY KEY, [Description] VARCHAR(100) NOT NULL);
INSERT INTO @source
VALUES (1, 'One')
, (2, 'Two')
, (3, 'Three')
, (4, 'Four')
, (5, 'Five')
, (6, 'Six')
, (7, 'Seven')
, (8, 'Eight')
, (9, 'Nine')
, (10, 'Ten')
, (11, 'Elleven')
, (12, 'Twelve')
, (13, 'Thirteen');
DECLARE @target TABLE (ID INT PRIMARY KEY, [Description] VARCHAR(100) NOT NULL);
-- DDL and data population, end
DECLARE @BatchNo INT = 1
, @NumberOfBatchesTotal DECIMAL = 3
, @RowsPerBatch INT
, @RowTotal INT;
-- To calculate # of rows per each Batch
SET @RowTotal = (SELECT COUNT(*) FROM @source);
SET @RowsPerBatch = CEILING(@RowTotal/@NumberOfBatchesTotal);
WHILE @BatchNo <= @NumberOfBatchesTotal
BEGIN
INSERT @target (ID, Description)
SELECT * FROM @source
ORDER BY ID
OFFSET (@BatchNo - 1) * @RowsPerBatch ROWS
FETCH NEXT @RowsPerBatch ROWS ONLY;
PRINT @BatchNo;
SET @BatchNo += 1;
END;
-- test
SELECT * FROM @target;