Одним из возможных решений будет минимизация времени, необходимого для обновления таблицы.
Сначала я бы создал промежуточную таблицу для загрузки данных из хранилища.
Если вам нужно сделать «вставки, обновления и удаления» в финальной таблице
Предположим, что финальный стол выглядит следующим образом:
Table Products:
ProductId int
QuantityOnHand Int
А вам нужно обновить Кол-во на складе со склада.
Сначала создайте промежуточную таблицу, например:
Table Prodcuts_WareHouse
ProductId int
QuantityOnHand Int
А затем создайте таблицу «Действия» следующим образом:
Table Prodcuts_Actions
ProductId int
QuantityOnHand Int
Action Char(1)
Процесс обновления должен быть примерно таким:
1.Обрезная таблица Prodcuts_WareHouse
2.Обрезать таблицу Prodcuts_Actions
3. Заполните таблицу Prodcuts_WareHouse данными из хранилища
4. Заполните таблицу Prodcuts_Actions следующим образом:
Вставки:
INSERT INTO Prodcuts_Actions (ProductId, QuantityOnHand,Action)
SELECT SRC.ProductId, SRC.QuantityOnHand, 'I' AS ACTION
FROM Prodcuts_WareHouse AS SRC LEFT OUTER JOIN
Products AS DEST ON SRC.ProductId = DEST.ProductId
WHERE (DEST.ProductId IS NULL)
Удаление
INSERT INTO Prodcuts_Actions (ProductId, QuantityOnHand,Action)
SELECT DEST.ProductId, DEST.QuantityOnHand, 'D' AS Action
FROM Prodcuts_WareHouse AS SRC RIGHT OUTER JOIN
Products AS DEST ON SRC.ProductId = DEST.ProductId
WHERE (SRC.ProductId IS NULL)
Обновление
INSERT INTO Prodcuts_Actions (ProductId, QuantityOnHand,Action)
SELECT SRC.ProductId, SRC.QuantityOnHand, 'U' AS Action
FROM Prodcuts_WareHouse AS SRC INNER JOIN
Products AS DEST ON SRC.ProductId = DEST.ProductId AND SRC.QuantityOnHand <> DEST.QuantityOnHand
До сих пор вы не заблокировали финальный стол.
5. В транзакции обновите финальную таблицу:
BEGIN TRANS
DELETE Products FROM Products INNER JOIN
Prodcuts_Actions ON Products.ProductId = Prodcuts_Actions.ProductId
WHERE (Prodcuts_Actions.Action = 'D')
INSERT INTO Prodcuts (ProductId, QuantityOnHand)
SELECT ProductId, QuantityOnHand FROM Prodcuts_Actions WHERE Action ='I';
UPDATE Products SET QuantityOnHand = SRC.QuantityOnHand
FROM Products INNER JOIN
Prodcuts_Actions AS SRC ON Products.ProductId = SRC.ProductId
WHERE (SRC.Action = 'U')
COMMIT TRAN
При всей описанной выше процедуре вы минимизируете количество обновляемых записей до необходимого минимума, и поэтому время, когда финальная таблица будет заблокирована при обновлении.
Вы даже можете не использовать транзакцию на последнем шаге, поэтому между командами будет освобождена таблица.