パッケージレベルでRequired
トランザクションを、タスクレベルでSupported
を使用するSSISパッケージがあります。パッケージの主要部分は、データの削除と新しいデータの挿入です。
ここで、Deleteブロックは6つのテーブルからすべてを削除し、Parseブロックは6つのファイルを6つのテーブルにロードします。
Deleteがdelete from dbo.table
を使用している場合、すべてが正常に機能しますが、速度は遅くなります。
しかしDeleteがtruncate table dbo.table
を代わりに使用する場合、削除には時間はかかりませんが、Parse
タスクに関してはパッケージがブロックされます。何もせずにただ座っているだけでしょうか。
この時点で、サーバー側でSSIS spidがspid -2
によってブロックされていることがわかります。これは「孤立した分散トランザクション」です。切り捨て接続を表すために使用されているように見えます。この接続は滞っており、パッケージはそれが配置したロックによってブロックされます。
使用されている唯一のSQL Server接続マネージャーをRetainSameConnection = True
に切り替えると、パッケージはParseタスクに入るとすぐに失敗します。タスクはマネージャに接続を要求し、マネージャは次のように応答します
[SQLサーバーの宛先[471]]エラー:SSISエラーコードDTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER。接続マネージャ「接続マネージャ」へのAcquireConnectionメソッドの呼び出しは、エラーコード0xC001A004で失敗しました。この前に、AcquireConnectionメソッドの呼び出しが失敗した理由の詳細が記載されたエラーメッセージが表示される場合があります。
truncate
を使用し、自分自身をブロックしないようにパッケージを設定する方法はありますか?
これは、実行前フェーズ中にデータベースからメタデータにアクセスするdelete
タスクが原因で発生するブロッキングが原因です。
ロックはsys.dm_tran_locks
を使用して見つけることができ、OPが検出されたときに-2
の値を持ちます。プロファイラーを使用して詳細を確認できます。
ブロッキングは、ValidateExternalMetadata
プロパティをFALSE
に変更するか、DELETE
ステートメントを使用してOPで述べたように解決できます。
参照: KB2253391