ばかげた質問かもしれませんが、挿入を分割/ページングして、他の操作が同じテーブルを更新できるようにする方法です。
2 つのストアド プロシージャがあり、1 つはバルク データを挿入します
ストアド プロシージャInsertIntoMyTable
:
INSERT INTO MyTable (column1, Column2, Column3)
SELECT Column1, @Column2, 0
FROM MyOtherTable
の主キーMyTable
は(Column1, Column2)
またMERGE
、同じテーブルに対する操作もありますMyTable
が、別のソースから、主に更新 (列 3) だけでなく、データを に挿入することもできますMyTable
。
問題は、1,000 万レコードの挿入にMyTable
時間がかかる場合、実行するストアド プロシージャが終了MERGE
するまで待たなければならないことInsertIntoMyTable
です。
これを解決しようとすると、ページ分割された
DECLARE @Start INT = 1
DECLARE @End INT = 1000
DECLARE @Amount INT = 1000
DECLARE @Total INT
SELECT @Total = COUNT(Column1) FROM MyOtherTable WHERE Column2 = @Column2
WHILE (@Start<=@Total)
BEGIN
INSERT INTO MyTable (column1, Column2, Column3)
SELECT Column1, @Column2, 0
FROM (SELECT
Column1,
Row_number() OVER(ORDER BY Column1) rownumber
FROM MyOtherTable
WHERE Column2 = @Column2) x
WHERE x.rownumber between @start and @end
SET @start = @end+1
SET @End = @End + @Amount
END
ただし、操作が終了するまでテーブルは引き続きロックされます。
注: 実行はトランザクションではありません。