Может быть, это глупый вопрос, но как разделить/разбить на страницы вставку, чтобы другие операции обновляли ту же таблицу.
У меня есть две хранимые процедуры, одна из которых вставляет объемные данные.
Хранимая процедура InsertIntoMyTable
:
INSERT INTO MyTable (column1, Column2, Column3)
SELECT Column1, @Column2, 0
FROM MyOtherTable
Первичный ключ MyTable
— (Column1, Column2)
А также есть операция MERGE
с той же таблицей MyTable
, но из другого источника, в основном с обновлением (столбец3), но также можно вставлять данные в MyTable
.
Проблема в том, что когда вставка в MyTable
занимает много времени, 10 миллионов записей, хранимая процедура, выполняющая 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
но по-прежнему блокирует таблицу до завершения операции.
Примечание. Выполнение не является транзакцией.