4

次のように、40,000回を超える反復でループ内でストアドプロシージャを実行するループがあります。

 SqlCommand command = new SqlCommand("WriteDataToDB");
        command.Connection = _connection;
        command.CommandType = CommandType.StoredProcedure;

        command.Parameters.Add("@SignalID", SqlDbType.Int).Value = Arg_Signal.SignalID;
        command.Parameters.Add("@SignalStrength", SqlDbType.Float).Value = Arg_Signal.SignalSiggestion;
        command.Parameters.Add("@Time", SqlDbType.BigInt).Value = Arg_Signal.TimeWasHit;
        command.Parameters.Add("@Value", SqlDbType.Float).Value = Arg_Signal.ValueWasHit;

        if (command.Connection.State != ConnectionState.Open)
        {
            command.Connection.Open();
        }
        command.ExecuteNonQuery();

このコードは、1000 回の反復ごとにインターセプトして時間を計測するループから呼び出されます。私が取得する時間は以下のとおりです。

[0]: "開始 0ms" [1]: "1000 完了 578.125ms"

[2]: "1000 完了 921.875ms"

[3]: "1000 完了 1328.125ms"

[4]: "1000 完了 1734.375ms"

[5]: "1000 完了 1140.625ms"

[6]: 「1000 完了 1250 ミリ秒」

[7]: "1000 完了 1703.125ms"

[8]: "1000 完了 1718.75ms"

……

[31]: "1000 完了 3234.375ms"

[32]: "1000 完了 3390.625ms"

[33]: "1000 完了 3453.125ms"

[34]: "1000 完了 3609.375ms"

[35]: "1000 完了 3765.625ms"

[36]: "1000 完了 3796.875ms"

[37]: "1000 完了 3968.75ms"

[38]: 「1000 完了 4093.75ms」

[39]: 「1000 完了 4203.125ms」

[40]: 「1000 完了 4546.875ms」

[41]: 「1000 完了 4406.25ms」

[42]: 「合計 101093.75ms 1515.625ms で停止」

これらの実行時間が増加している理由を知っている人はいますか? このコードを 100 万回以上反復して実行する必要があります。

どうもありがとう

4

3 に答える 3

1

ストアド プロシージャに特別なロジックがありますか、それともテーブルに挿入するだけですか。

特別なロジックがない場合、または .NET でそのロジックを実行できる場合は、一括挿入の実行を検討してください。System.Data.SqlClient.SqlBulkCopyこれは、クラスを利用して行うことができます。

于 2010-07-09T02:26:57.143 に答える
0

毎回遅くなる理由を知っているとは言えません(実際には「1000」を毎回クリアするのではなく、実際に追加するか何かを追加しているように聞こえます)が、データをデータベースにダンプしようとしている場合は、for ループ内のストアド プロシージャではなく、SqlBulkCopyのようなものを使用する必要があります。

于 2010-07-09T02:23:40.287 に答える
0

これは単なる推測ですが、反復ごとにパラメーターを追加しています。SqlCommandはい、以前と同じ名前ですが、クラスがそれを処理するのに十分賢いかどうかはわかりません。パラメータを一度追加してから、ループで値を設定してみてください。

ループの外側:

command.Parameters.Add("@SignalID", SqlDbType.Int);

ループ内:

command.Parameters["@SignalID"].Value = Arg_Signal.SignalID;

それでも問題が解決しない場合は、コードをプロファイリングして、どこが遅いかを確認する必要があります。実際の DB 呼び出しではない可能性があります。

余談ですがcommand.Prepare()、同じコマンドを何度も実行するときに呼び出すこともできます。この特定の問題は解決されませんが、とにかくパフォーマンスがわずかに向上する可能性があります。

于 2010-07-09T02:25:17.867 に答える