2011-01-10 11 views
5

指定:SQL Server 2008 R2。いくつかのspeedinデータディスクを終了します。ログディスクの遅延。大量の挿入パフォーマンスを最適化する...?

必須:多くの挿入が必要です。 10.000〜30.000行と同様に、1秒あたり2つのインデックスを持つ単純なテーブルになります。挿入物の順序は短期間で維持されてはならない(すなわち、複数の平行な挿入物はOKである)ので、挿入物は本質的な順序を有し、繰り返さない。

これまでのところ、データをキューに蓄積しています。定期的に(非同期スレッドプール)、キューに入れられた作業項目に最大1024の項目を格納します。スレッドプール(カスタムクラス)には32のスレッドがあります。 32の接続を開きます。

問題:パフォーマンスは300倍になります.1秒あたり約100〜150行しか挿入されません。ログ待機時間は、SQL Serverの処理時間の40%〜45%(ms /秒)です。サーバーのCPU負荷が低い(4%〜5%程度)。

使用不可:バルクインサート。データはできるだけリアルタイムでディスクに書き込まなければなりません。これは、システムを実行するデータのアーカイブプロセスですが、定期的にデータにアクセスする必要のあるクエリがあります。私はそれらをディスクにダンプして、1秒に1-2回バルクアップロードを使って試してみることができます。これを試してみましょう。

誰でもスマートなアイデアですか?私の次のステップは、ログを高速ディスクセット(128GBの現代ssd)に移動し、その後何が起こるかを見ることです。大幅なパフォーマンスの向上は、おそらくかなり異なることになります。しかし、それでも....問題は実現可能かどうかです。

スマートなアイデアを発射してください。

+3

から撮影しますか? – Carth

答えて

4

わかりました。 SqlBulkCopyに65536エントリまでバッチ処理を行い、1秒ごとに非同期でそれらをフラッシュします。利益について報告します。

+3

3スレッドを使用して1秒あたり75.000レコードになります。 – TomTom

+0

うわー、それはかなり印象的な、素晴らしい仕事です! –

3

私はここでまったく同じ問題を抱えているので、私はパフォーマンスを改善するために取っている手順を説明します。この中で - あなたは挿入の順序は重要ではないという事実以外の任意のインデックスの要件については言及しなかった

  • 異なるスピンドルセットにログオンして、DBFファイルセパレート
  • 利用の基本的な回復
  • ID列以外のクラスター化インデックスは使用しないでください。
  • 同時実行性のスケーリングを1から再開し、パフォーマンスが平坦になると停止します。これ以上あれば、パフォーマンスが低下する可能性があります。
  • bcpにディスクにドロップするのではなく、SQL Server 2008を使用しているときに一度に複数の行を挿入することを検討してください。この文は、単一のSQL呼び出しでテーブルVALUES INTO

    INSERT(1,2,3)、(4,5,6)を、私は(7,8,9)

た3行を挿入します1つのスレッドから1秒あたり〜500個の異なるインサートをトッピングする。ネットワークとCPU(クライアントとサーバーの両方で0)を除外した後、サーバー上のディスクioが責任を負うと仮定しましたが、3つのバッチに挿入すると、ディスクI/Oを排除する1秒あたり1500個の挿入があります。

MSクライアントライブラリに上限が設定されていることは明らかです(リフレクタへのダイビングでは、ヘアリーな非同期完了コードが表示されます)。

挿入を呼び出す前にxイベントが受信されるのを待って、私の設定の上限であると思われる1つのスレッドから〜2700個/秒の挿入を挿入しました。

注:常時イベントが到着していない場合は、一定期間後に挿入をフラッシュするタイマーを追加することをお勧めします(その日の最後のイベントが表示されるようにしてください)。

増加挿入のパフォーマンスのための
1

ヒント:

  • 増加ADO.NETのBatchSize
  • 挿入がクラスタ化インデックスのノード分割につながるしないように、賢く対象テーブルのクラスタ化インデックスを選択してください(例:AUTOINC列)
  • 一時的なヒープテーブルに最初に挿入し、大きな「insert-by-select」ステートメントを発行して、そのステージングテーブルのすべてのデータを実際のターゲットテーブルにプッシュする
  • 適用SqlBulkCopy
  • 「バルクログ」復旧モデルinstad of 「フル」復旧モデル
  • 場所(あなたのビジネスシナリオがそれを可能にしている場合)を挿入する前に、テーブルロックを

はあなたがこれまで最終的な解決を取得しましたTips For Lightning-Fast Insert Performance On SqlServer

関連する問題