在循环中调用sqlCommand,每步增加执行时间

时间:2010-07-09 02:20:44

标签: c# .net asp.net sqlconnection sqlcommand

我有一个循环,它在循环中执行存储过程,迭代次数超过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完成1250ms”

[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”

有谁知道为什么这些执行时间会增加?我需要运行这个代码超过一百万次迭代 - 按照它的速度执行一次迭代需要一分钟......

非常感谢

3 个答案:

答案 0 :(得分:1)

您的存储过程中是否有任何特殊逻辑,或者您只是插入表中。

如果没有特殊逻辑或者您可以在.NET中执行该逻辑,那么请查看执行Bulk Insert。您可以使用System.Data.SqlClient.SqlBulkCopy类来完成此操作。

答案 1 :(得分:0)

我不能说我知道你为什么每次都变慢(听起来你实际上并没有每次都清除“1000”,但实际上是在追加它们等等)但是如果你想将数据转储到你应该使用SqlBulkCopy之类的数据库,而不是for循环中的存储过程。

答案 2 :(得分:0)

这只是猜测,但您在每次迭代时都会添加更多参数。是的,它们与以前名称相同,但我不知道SqlCommand类是否足够聪明来处理它。尝试添加一次参数,然后在循环中设置它们的值,即

循环之外:

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

循环内部:

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

如果这没有帮助,您必须分析代码并查看它的速度 - 它可能不是实际的数据库调用。

顺便说一下,你也可以尝试多次执行同一个命令时调用command.Prepare() - 它不会解决这个特殊的问题,但无论如何都可能会产生轻微的性能差异。