2

私は2つのテーブルT_AT_B.

  • どちらも空です。
  • どちらにもクラスター化インデックスがあります。
  • 復旧モデルは に設定されていSIMPLEます。
  • insert...select.. は、最小限のロギングの要件を満たしています。http://msdn.microsoft.com/en-us/library/ms191244.aspxを参照して ください。
  • どちらのステージング テーブルにも大量のデータが含まれています。

ステージング テーブルからそれらにデータをインポートする必要があります。

次の T-SQL ブロックを個別に実行すると、それぞれが完了するまでに 2 ~ 3 分かかります。合計時間は約5〜6分です。

BEGIN TRAN
  INSERT INTO T_A WITH(TABLOCK) FROM SRC_A WITH(NOLOCK);
COMMIT TRAN

BEGIN TRAN
  INSERT INTO T_B WITH(TABLOCK) FROM SRC_B WITH(NOLOCK);
COMMIT TRAN

高速化するために、SMSS で 2 つのセッションを開き、2 つのブロックを並行して実行します。驚いたことに、各セッションの所要時間は約 10 ~ 12 分です。合計時間は 2 倍以上になります。wait_type示されているのはPAGEIOLATCH_SH、ディスク I/O のボトルネックを示しています。私が理解していないのは、2 つのセッションが I/O を互いに待機しなければならない場合でも、それほど長く待機すべきではないということです。誰でもこれを説明できますか?

私の話はまだここで終わっていません。次に、両方のテーブルのクラスター化インデックスを削除し、2 つのブロックをそれぞれ別のセッションで並行して実行しました。今回はそれぞれ約1分で終了。並行しているので合計時間は約1分。すごい!しかし、クラスター化されたインデックスを作成しようとすると、悪夢が起こります。

クラスタ インデックスを個別に作成すると、完了するまでにそれぞれ 4 分かかります。合計時間は約8分です。これは、パフォーマンスを向上させるという私の目的を無効にしました。

次に、2 つのテーブルにそれぞれ別のセッションで並行してクラスター化インデックスを作成しようとしました。今回は最悪で、一方は終了するのに 12 分かかり、もう一方は終了するのに 25 分かかります。

私のテスト結果から、私の最善の選択は正方形に戻ります。つまり、テーブルのクラスター化されたインデックスを使用して 2 つのトランザクションを順番に実行します。

誰かが同様の状況を経験したことがありますか?それを高速化するためのベストプラクティスは何ですか?

4

1 に答える 1