2

現在、 Windows AzureSQLDatabaseで大規模なデータセットをマージしています。次のエラーが発生しないようにする方法があるかどうか疑問に思いました。

40552:トランザクションログスペースの使用量が多すぎるため、セッションが終了しました。1回のトランザクションで変更する行を減らしてみてください。

私のデータセットは1500万レコードを超えています。

4

1 に答える 1

3

アプリケーションから、インポートする必要のあるレコードの数を見つけ、バッチサイズに基づいて、実行する必要のあるバッチの数を計算します。次に、バッチごとに、正しいオフセットインデックスを使用してストアドプロシージャのマージを実行する新しいSQLコマンドを作成します。各SQLコマンドの間に短い遅延を挿入してください。実行速度が速すぎると、要求の数が多すぎるためにWindowsAzureSQLデータベースで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 に答える