特定数以上の行を挿入すると、INSERTに5時間以上かかる


8

テーブルに約1,350,000行未満を挿入する場合、すべて約2分かかりますが、挿入される行数が多い場合、データの挿入に必要な時間は約5時間に増加します。

問題はクエリまたはインデックスに関連していません。すべてが長い間正常に動作しており、クエリ、テーブル、またはインデックスの構造には何も変更されていないためです。

約2週間前に初めて問題が発生し、挿入された行の数が+ -1,350,000を超える日にも繰り返し発生します。たとえば、ある日に挿入された行の数は1,200,000であり、プロセスに2分かかり、他の日に行の数は1,450,000であり、データの挿入に5〜6時間かかります。

インデックスを再構築しようとしましたが、役に立ちませんでした。


3
インサートのソースは何ですか?
マーティンスミス

4
挿入に非常に長い時間がかかる場合に関連付けられる待機は何ですか?
キンシャー

4
あなたがより多くの情報を与えない限り、私たちは推測することができます。私の推測では、ロックのエスカレーションが発生しています。待機を追跡してエスカレーションをロックできますか
Shanky

1
130万件のレコードを挿入するのは今回が初めてですか。取引をしていますか?一括インポート?どのタイプのロギングを行っていますか?単純明快な挿入を行う場合は、同意します。挿入をバッチで実行してみてください。
SQLburn

2
データ(bcp、一括挿入、SSIS、バッチファイル)をどのようにインポートしますか?どこから(ローカルストレージ、同じ/異なるドライブ、ネットワークストレージなど)?テーブルスキーマとは何ですか?インポートコマンドとは 実行プランは何ですか(プレーンT-SQLの場合)?
マリアン

回答:


14

私の推測では、実際にブロックされていない場合は、データファイル(またはログファイル)が増加する必要があるしきい値に達しており、構成がこの増加をサポートするように最適化されていないと考えられます。確認しておいて:

  1. データファイルの増加率は妥当であり、このトランザクションや他の同時進行に対応できる十分な大きさの固定サイズ(%!ではありません)です。
  2. ログファイルについても同じです。
  3. ファイルの即時初期化が有効になっています。これは、データファイルの増大を加速するのに役立ちますが、多くの場合、より面倒なログファイルの増大には役立ちません。
  4. ループに135万の個別の行を挿入したり、その他すべてを1つの大きなトランザクションとして挿入したりしていません。トランザクションをチャンクに分割するために言うべきことがあります

1
アーロンは、データまたはログファイルのファイル成長のような彼の提案のように聞こえています。また、仮想ログファイルの数が少ないことを確認してください。
ナンフィビア語2014

4

これはメモリの問題でしょうか?

この種の動作は、繰り返しアクセスする必要のあるデータのチャンクがメモリに対して大きくなりすぎて、地獄からディスクスラッシュが発生した場合に発生する可能性があります。メモリに対して大きすぎるデータのチャンクをループする必要がある場合、すべてのパスでスワップファイルからすべてが読み取られることになり、その制限を超えてプッシュすると、パフォーマンスが低下する可能性があります。


3

あなたがしようとしている/それらを小さなバッチに分割することは可能ですか?私が同様の問題に遭遇したとき、それらを5.000で(GOを使用して)グループ化すると、そのようなタスクを完了するのにかかる時間が本当に短縮されました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.