SSISパッケージは、読み込み前にRefresh Exchange Rates
と呼ばれるパッケージを呼び出しています。これは、他のパッケージが更新されているためです。同じコードを複数回実行すると、プライマリキーの制約エラーが発生する
Exchangeレートテーブルには、重複エントリを防ぐための主キー制約があります。場合によっては、複数のパッケージが同じコードを呼び出しているため、Refresh Exchange Rates
パッケージが複数回同時に実行されることがあります。次のコードは実行されますが、複数回実行すると主キー制約が生成されます。
TRUNCATE TABLE dbo.FactExchangeRate
INSERT INTO dbo.FactExchangeRate (
FromCurrencyId,
ToCurrencyId,
RateDate,
ExchangeRate
)
SELECT
FromDimCurrency.Id AS FromCurrencyId,
ToDimCurrency.Id AS ToCurrencyId,
CAST(AXCURD.DT AS DATE) AS RateDate,
AXCURD.EXRATE AS ExchangeRate
FROM
DataWarehouseRawData.dbo.AXCURD
INNER JOIN
dbo.DimCurrency FromDimCurrency ON
FromDimCurrency.SourceKey = AXCURD.FRAXCURIDX
INNER JOIN
dbo.DimCurrency ToDimCurrency ON
ToDimCurrency.SourceKey = AXCURD.TOAXCURIDX
これを防ぐにはどうすればよいですか? コードが複数回(この例では3回)実行されていることを知っていますので、これはトランザクションなどと関係があると思います。TABLOCKX
を挿入してみましたが、 TRUNCATE
からDELETE
(取引の場合)、またBEGIN TRANSACTION
などを試しましたが、最終的にデッドロックが発生しました。
ではなくTRUNCATE/INSERTパターンパターンまたはMERGEコマンドをDELETE/INSERT/UPDATEを使用します。一般的に、これは、データウェアハウスで、特に切り捨て/挿入よりも良いアイデアです。たとえば、現在のところ、ロード・プロセスに失敗するため、データ・ウェアハウスに外部キーを作成できない可能性があります。詳細を知りたい場合 –
ほとんどの次元がマージされていますが、これは簡単なプロセスで切り詰めてリロードするという事実の1つです。私たちは故意に外来キーを持っていません。なぜマージが私の問題に役立つのか説明できますか?マージは本当にdml操作の文法的な砂糖ではありませんか? – Lock
マージでは、すでに存在するレコードは理論上挿入されませんが、複数のセッションがあるので、あまりよく分かりません。個人的には、MERGEへのINSERT/UPDATE/DELETE文を別々にする方が好きです。なぜなら、明らかにいくつかのバグ(これは修正されるかもしれません)があるからです。より根本的な解決策は、スナップショットアイソレーションを有効にしてからトランザクションを使用することです。これは、テーブルがトランザクション内でロックされている間は、ロックされずに以前存在していたテーブルのバージョンを使用します。 –