如何在不造成数据库超载的情况下从 SQL Server 中的 600 万行表迁移数据

问题描述 投票:0回答:1

由于资源限制,我在将数据从具有 600 万行的表迁移到 SQL Server 数据库中的另一个表时遇到困难。数据库相对较小,当我一次发送 100,000 行时,DTU 使用率飙升至 100%,这会影响系统的性能和稳定性。

我尝试了多种迁移方法,包括:

  • 使用Python进行批处理
  • 使用 INSERT SELECT 命令
  • 将数据从 CSV 文件导入到目标表

然而,所有这些方法都导致了数据库过载,并且未能有效地实现平滑迁移。

在不导致数据库资源利用率过高的情况下迁移大量数据的最佳实践或技术是什么?是否有一种有效的方法可以将迁移分解为更小的步骤,而不会使处理花费太多时间,或者优化流程以最大程度地减少对数据库的影响?

python sql-server database migration
1个回答
0
投票

您可以尝试以下概念示例。

它将从 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;
© www.soinside.com 2019 - 2024. All rights reserved.