2

我目前正在合并Windows Azure SQL Database中的大型数据集。我想知道是否有办法不出现以下错误:

40552 : 由于事务日志空间使用过多,会话已终止。尝试在单个事务中修改更少的行。

我的数据集超过 1500 万条记录。

4

1 回答 1

3

从应用程序中找到需要导入的记录数,并根据批处理大小计算需要执行的批处理数。然后对于每个批次,创建一个新的 SQL 命令,该命令执行具有正确偏移索引的合并存储过程。确保在每个 SQL 命令之间插入一个短暂的延迟,因为如果它们运行得太快,Windows Azure SQL 数据库可能会由于请求数量过多而引发40501 。

CREATE PROCEDURE [dbo].[MergeCustomerTables]
        @offsetIndex int = 0,
        @batchSize int = 10000
AS

DECLARE @offset as bigint

SELECT @offset = @offsetIndex *  @batchSize

MERGE Customers AS Target
USING (SELECT a.[Name], a.[LastName], a.[Email] from CustomerInsertTable as a
       ORDER BY a.[Email]
       OFFSET  @offset ROWS 
       FETCH NEXT @batchSize ROWS ONLY 
) AS Source
ON (Target.[Email] = Source.[Email])
WHEN MATCHED THEN
    UPDATE SET Target.[Name] = Source.[Name]
             , Target.[LastName] = Source.[LastName]
WHEN NOT MATCHED BY TARGET THEN
    INSERT ([Name], [LastName], [Email])
    VALUES (
     Source.[Name] 
     , Source.[LastName]
     , Source.[Email]
    );
于 2013-01-15T17:32:44.547 回答