Вызов sqlCommand в цикле, увеличивающий время выполнения каждого шага - PullRequest
4 голосов
/ 09 июля 2010

У меня есть цикл, который выполняет хранимую процедуру в цикле с более чем 40000 итераций, например:

 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,875мс»

[3]: «1000 выполнено 1328,125мс»

[4]: ​​«1000 сделано 1734,375мс»

[5]: «1000 сделано 1140,625мс»

[6]: «1000 сделано 1250мс»

[7]: «1000 выполнено 1703,125мс»

[8]: «1000 сделано 1718,75мс»

......

[31]: «1000 выполнено 3234,375мс»

[32]: «1000 выполнено 3390,625мс»

[33]: «1000 выполнено 3453,125мс»

[34]: «1000 сделано 3609,375мс»

[35]: «1000 выполнено 3765,625мс»

[36]: «1000 сделано 3796,875 мс»

[37]: "1000 сделано 3968,75 мс"

[38]: «1000 сделано 4093,75мс»

[39]: «1000 выполнено 4203,125мс»

[40]: «1000 выполнено 4546,875мс»

[41]: «1000 выполнено 4406,25 мс»

[42]: «Остановлено с общим значением 101093,75 мс 1515,625 мс»

У кого-нибудь есть идея, почему время выполнения увеличивается? Мне нужно запустить этот код с более чем миллионом итераций - по скорости его выполнения потребуется одна минута, чтобы выполнить одну итерацию ...

Большое спасибо

Ответы [ 3 ]

1 голос
/ 09 июля 2010

Есть ли какая-то особая логика в вашем сохраненном процессе или вы просто вставляете в таблицу.

Если специальной логики нет или вы можете сделать эту логику в .NET, взгляните на выполнение Bulk Insert . Вы можете сделать это, используя класс System.Data.SqlClient.SqlBulkCopy.

0 голосов
/ 09 июля 2010

Это только предположение, но вы добавляете больше параметров для каждой итерации.Да, они имеют те же имена, что и раньше, но я не знаю, достаточно ли умен класс SqlCommand, чтобы справиться с этим или нет.Попробуйте добавить параметры один раз, а затем просто установить их значение в цикле, т.е.

За пределами цикла:

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

Внутри цикла:

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

Если это не поможет, вам придется профилировать код и посмотреть, где он медленный - это может быть не фактический вызов БД.

Кроме того, вы могли бы также попытаться вызвать command.Prepare() при выполненииодна и та же команда много раз - это не решит эту конкретную проблему, но в любом случае может привести к небольшой разнице в производительности.

0 голосов
/ 09 июля 2010

Не могу сказать, что знаю, почему вы идете медленнее каждый раз (звучит так, будто вы на самом деле не очищаете «1000» каждый раз, а фактически добавляете их или что-то в этом роде), но если вы хотите сбросить данные в база данных, которую вы должны использовать, например, SqlBulkCopy , а не хранимый процесс внутри цикла for.

...