1

ばかげた質問かもしれませんが、挿入を分割/ページングして、他の操作が同じテーブルを更新できるようにする方法です。

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

ただし、操作が終了するまでテーブルは引き続きロックされます。

注: 実行はトランザクションではありません。

4

1 に答える 1