私は2つのテーブルT_A
とT_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 つのトランザクションを順番に実行します。
誰かが同様の状況を経験したことがありますか?それを高速化するためのベストプラクティスは何ですか?