web-dev-qa-db-ja.com

TRUNCATEを使用すると、SSISパッケージはそれ自体をブロックします

パッケージレベルでRequiredトランザクションを、タスクレベルでSupportedを使用するSSISパッケージがあります。パッケージの主要部分は、データの削除と新しいデータの挿入です。

enter image description here

ここで、Deleteブロックは6つのテーブルからすべてを削除し、Parseブロックは6つのファイルを6つのテーブルにロードします。

Deletedelete from dbo.tableを使用している場合、すべてが正常に機能しますが、速度は遅くなります。
しかしDeletetruncate table dbo.tableを代わりに使用する場合、削除には時間はかかりませんが、Parseタスクに関してはパッケージがブロックされます。何もせずにただ座っているだけでしょうか。

この時点で、サーバー側でSSIS spidがspid -2によってブロックされていることがわかります。これは「孤立した分散トランザクション」です。切り捨て接続を表すために使用されているように見えます。この接続は滞っており、パッケージはそれが配置したロックによってブロックされます。

使用されている唯一のSQL Server接続マネージャーをRetainSameConnection = Trueに切り替えると、パッケージはParseタスクに入るとすぐに失敗します。タスクはマネージャに接続を要求し、マネージャは次のように応答します

[SQLサーバーの宛先[471]]エラー:SSISエラーコードDTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER。接続マネージャ「接続マネージャ」へのAcquireConnectionメソッドの呼び出しは、エラーコード0xC001A004で失敗しました。この前に、AcquireConnectionメソッドの呼び出しが失敗した理由の詳細が記載されたエラーメッセージが表示される場合があります。

truncateを使用し、自分自身をブロックしないようにパッケージを設定する方法はありますか?

4
GSerg

これは、実行前フェーズ中にデータベースからメタデータにアクセスするdeleteタスクが原因で発生するブロッキングが原因です。

ロックはsys.dm_tran_locksを使用して見つけることができ、OPが検出されたときに-2の値を持ちます。プロファイラーを使用して詳細を確認できます。

ブロッキングは、ValidateExternalMetadataプロパティをFALSEに変更するか、DELETEステートメントを使用してOPで述べたように解決できます。

参照: KB2253391

3
Kin Shah