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]:“开始 0 毫秒”[1]:“1000 完成 578.125 毫秒”

[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.625 毫秒”

[33]:“1000 完成 3453.125ms”

[34]:“1000 完成 3609.375ms”

[35]:“1000 完成 3765.625 毫秒”

[36]:“1000 完成 3796.875 毫秒”

[37]:“1000 完成 3968.75 毫秒”

[38]:“1000 完成 4093.75 毫秒”

[39]:“1000 完成 4203.125ms”

[40]:“1000 完成 4546.875 毫秒”

[41]:“1000 完成 4406.25 毫秒”

[42]:“总停止 101093.75ms 1515.625ms”

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

非常感谢

4

3 回答 3

1

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

如果没有特殊逻辑,或者您可以在 .NET 中执行该逻辑,请查看执行Bulk Insert。您可以通过使用System.Data.SqlClient.SqlBulkCopy该类来做到这一点。

于 2010-07-09T02:26:57.143 回答
0

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

于 2010-07-09T02:23:40.287 回答
0

这只是一个猜测,但您在每次迭代中添加了更多参数。是的,他们的名字和以前一样,但我不知道这个SqlCommand班级是否足够聪明来处理这个问题。尝试添加一次参数,然后在循环中设置它们的值,即。

循环外:

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

循环内部:

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

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

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

于 2010-07-09T02:25:17.867 回答