2011-12-14 12 views
0

私はMS SQLデータベース(サーバではない)を持っています。私のプログラムは2 TBの外部ドライブからファイル構造を読み込み、リストをデータベースに保存します。私は毎回約80kのレコードを書いており、すばらしい時間がかかります。マルチスレッドSQLクライアント書き込みクエリ

現在、2つのバックグラウンドワーカースレッド40kにそれぞれ分割してレコードを作成しています。私のPCはQuad core Phenom IIです。

これを達成するための最良の方法は何か、また、スレッド数を増やすことでメリットは7200rpm hddであり、襲撃ではないため、メリットがあります。私が意味することは、HDDが限界かもしれないということですか?

ありがとうございます。

編集:時間はすべてのレコードが15-18分程度です。私はストアドプロシージャを使用していません。私は自動生成されたテーブルアダプターからのみ挿入コマンドを使用しています。私はスレッドごとに40k回insert文をループしています。いいえ、インデックス付きファイルに基づいて更新するのではなく、単に挿入ステートメントです。

答えて

2

80kレコードには時間がかかりません。あなたは「素晴らしい時」と言いますが、それは実際何ですか?私たちはあなたの相対的な言葉の実際の時間を知らない。

1)ストアドプロシージャを使用していますか? 2)バルクで処理できるもの(BCPか、多くの挿入/更新文が生成されて1つのコマンドで送信される)ですか? 3)すべての更新はWHERE句のインデックス付きフィールドを使用していますか?

1)そのデータベースの両方とあなたが書いているデータを収容するのに十分な空き領域よりも多くを持って書いているデータベースのログファイルを確認します。

+0

こんにちはJared Pelessさん、私は質問の編集に情報を追加しました。ありがとうございました。 – surpavan

+0

テーブルアダプタを使用している場合は、テーブルが完全に挿入されていることを確認してから、更新/挿入を実行するとパフォーマンスが向上します。 –

+0

私は挿入を行うだけですが、私はアップデートを使用しませんが、スレッドの数を増やすなど、この高速プロセスの例をどのようにすることができるのかという問題があり、最大4つのスレッドを試しましたが、私のテストでは、2つのスレッドが最適なポイントであることがわかりました。 – surpavan

1

私は提案のカップルを持っています。データベースの動的なサイズ変更は、SQL Serverにとって非常にコストがかかる操作です。小さいサイズのデータ​​ベースで開始すると、サイズ変更の割合は小さくなりますが、サイズを変更し続けることになります。

2)挿入コマンドをトランザクション内にラップします。これにより速度が大幅に向上するはずです。 1つのトランザクションですべての80kレコードをラップすることはできませんが、一度に1000回試すことができます。擬似コード:

Const MAX_RECORDS_PER_LOOP = 1000 
    Dim Counter As Integer 
    Dim trans As SqlTransaction 

    Try 
     For Each record In File 
      ' If we are not in a transaction, enter one 
      If trans Is Nothing Then 
       trans = conn.BeginTransaction() 
      End If 

      ' Do your insert 

      ' Boost the counter 
      Counter += 1 

      ' We have reached the max 
      If Counter = MAX_RECORDS_PER_LOOP Then 
       ' Commit the previous batch and reset the values 
       trans.Commit() 
       trans = Nothing 
       Counter = 0 
      End If 
     Next 

     ' Commit the last batch, if any 
     If trans IsNot Nothing Then 
      trans.Commit() 
     End If 

    Catch theException As Exception 
     ' Report the exception 
     ' Rollback if trans in progress 
     If trans IsNot Nothing Then 
      trans.Rollback() 
     End If 
    End Try 
関連する問題