0

私はMSSQLデータベース(サーバーではない)を持っています。私のプログラムは2 TBの外付けドライブからファイル構造を読み取り、リストをデータベースに記録します。私は毎回約80kのレコードを書いていますが、それにはかなりの時間がかかります。

私は現在、レコードをそれぞれ2つのバックグラウンドワーカースレッド40kに分割してレコードを書き込んでいます。私のPCはクアッドコアPhenomIIです。

これを達成するための最良の方法は何ですか?また、私のものは7200rpmのhddであり、レイドではないため、スレッドの数を増やすことでメリットがあります。HDDが制限になる可能性があるということですか?

ありがとうございました。

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

4

2 に答える 2

2

80,000 件のレコードにそれほど時間はかかりません。「素晴らしい時間」と言いますが、それは実際には何ですか?あなたの相対期間の実際の時間はわかりません。

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

于 2011-12-14T11:50:12.230 に答える
1

いくつかの提案があります。

1) 書き込み中のデータベースのデータベースとログ ファイルの両方に、書き込み中のデータを収容するのに十分な空き領域があることを確認します。データベースの動的なサイズ変更は、SQL Server にとって非常にコストのかかる操作であり、サイズ変更のパーセンテージが小さい小さなデータベースから始めると、サイズを継続的に変更することになります。

2) 挿入コマンドをトランザクションでラップします。これにより、速度が大幅に向上するはずです。1 回のトランザクションで 80,000 レコードすべてをラップすることはおそらくできませんが、一度に 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
于 2011-12-14T18:15:55.653 に答える