考えられる解決策の 1 つは、テーブルの更新に必要な時間を最小限に抑えることです。
最初にステージング テーブルを作成して、ウェアハウスからデータをダウンロードします。
最終テーブルで「挿入、更新、および削除」を行う必要がある場合
フィナーレのテーブルが次のようになっているとします。
Table Products:
ProductId int
QuantityOnHand Int
また、倉庫から QuantityOnHand を更新する必要があります。
まず、次のようなステージング テーブルを作成します。
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
上記のすべてのプロセスを使用すると、更新するレコードの量を必要最小限に抑えることができるため、更新中に最終テーブルがロックされる時間を最小限に抑えることができます。
最終ステップでトランザクションを使用することさえできないため、コマンド間でテーブルが解放されます。