私はクエリで大きなINSERTの問題を見てきました:
INSERT table_name
SELECT .....;
テーブルにはインデックスがなく、テーブルに挿入するには約2,000万行が必要です。サーバーの1つでSQLServer2008R2でクエリを実行します。元のパフォーマンスは約40分です。INSERT
次に、ここで投稿を読んで、BEGIN TRANSACTION
/でラップするように指示しますCOMMIT
。私はそれをしました、そして費やされた時間は6分に落ちました。
TRANSACTION
ただし、トランザクションラップクエリを次の数回実行しようとすると、効果がなくなったように、時間が40分に戻りました。次の実行で何が起こったのかわかりません。何か案が?
追加:
もう1つの投稿によると、TRANSACTIONはパフォーマンスではなくデータの一貫性を保つために使用されることを意図しており、5K行ごとにバッチ挿入することを提案しています。上記の単一のINSERTSELECTステートメントをバッチに分割するにはどうすればよいですか?私は混乱しています。
アップデート:
実際、パフォーマンスの向上はTRANSACTIONによるものではなく、サーバー側のテーブルキャッシングによるものである可能性があります。これは、次の数回実行すると、パフォーマンスが5分程度になるためです。