2

サーバーAからサーバーBにテーブル全体を切り捨てて挿入するSSISパッケージがありますが、サーバーBでNOLOCKヒントを指定して選択を実行することでジョブの進行状況を表示しようとしていますが、「BULKINSERT」によってロックされます。 SSISパッケージによって実行されます。

「sys.dm_tran_locks」を確認したところ、「BULK INSERT」がテーブルに「Sch-M」ロックを保持していることがわかりましたが、その理由がわかりません。

これを手伝ってくれませんか。

ありがとう。

4

2 に答える 2

3

Sch-Mロックは、宛先テーブルに少なくとも1つのインデックスがあることを示します。

「一括インポート中のテーブルのロックとロギング」を参照してください。

http://msdn.microsoft.com/en-us/library/ms177445%28v=sql.105%29.aspx

リファレンスの表に基づいて、Sch-Mは、次の場所に一括挿入するときに使用されます。

  1. 非クラスター化インデックスとタブロックが1つあるヒープが使用されます
  2. 空のBツリー(クラスター化インデックス)とタブロックが使用されます

また、ロードが正しく行われると、一括挿入が開始される前に切り捨てが完了します(そして、Sch-Mロックが解除されます)。

一括更新(BU)ロックが最適なロックですが、一括挿入中にテーブルを読み取ることを期待しないでください。

一括更新(BU)ロックを使用すると、プロセスはデータを同じテーブルに同時に一括コピーできますが、データを一括コピーしていない他のプロセスはテーブルにアクセスできません http://msdn.microsoft.com/en-us/library/aa213039%28v=sql.80%29.aspx

進行状況を確認するには、Remusの提案(sys.allocation_units)を使用します。

于 2012-12-13T14:42:03.410 に答える
1

Truncate では、テーブルアロケーション ユニットの割り当てを解除するために SCH-M が必要です。とりわけ、このロックは、同時ダーティ リードから保護するというまさにその目的を果たします。切り捨てがテーブルの割り当て解除に成功し、ダーティ リード スキャナーがその中にある場合、これらのスキャナーは突然、誰にも属さない (またはさらに悪いことに、他の AU に再割り当てされた) ページを読み取っていることに気付くでしょう。他の書き込みロックと同様に、2PL プロトコルはトランザクションの終了まで保持する必要があります。後続のダーティ スキャナは、必要に応じてその背後でブロックします。

トランザクションに包まれた切り捨て/バルクインサートがない場合、Xの代わりにバルク挿入がSCH-Mに移動する可能性のある他のシナリオがあります(空のテーブルのバルクインサートのテーブルロックヒント(AUルートなしページ)これを引き起こします)。

BULK INSERT の進行状況をのぞき見しすぎて、 でターゲットに割り当てられているページ数を確認しますsys.allocation_units。これにより、完了率の大まかな見積もりが得られます。

于 2012-12-13T14:37:55.687 に答える