現在、 Windows AzureSQLDatabaseで大規模なデータセットをマージしています。次のエラーが発生しないようにする方法があるかどうか疑問に思いました。
40552:トランザクションログスペースの使用量が多すぎるため、セッションが終了しました。1回のトランザクションで変更する行を減らしてみてください。
私のデータセットは1500万レコードを超えています。
現在、 Windows AzureSQLDatabaseで大規模なデータセットをマージしています。次のエラーが発生しないようにする方法があるかどうか疑問に思いました。
40552:トランザクションログスペースの使用量が多すぎるため、セッションが終了しました。1回のトランザクションで変更する行を減らしてみてください。
私のデータセットは1500万レコードを超えています。
アプリケーションから、インポートする必要のあるレコードの数を見つけ、バッチサイズに基づいて、実行する必要のあるバッチの数を計算します。次に、バッチごとに、正しいオフセットインデックスを使用してストアドプロシージャのマージを実行する新しい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]
);