Почему оператор вставки работает медленно с SqlCommand? - PullRequest
0 голосов
/ 05 июля 2018

Я использую SqlCommand для вставки нескольких записей в базу данных, но для вставки 2000 записей требуется много времени, я сделал следующий код:

using (SqlConnection sql = new SqlConnection(connectionString))
{
    using (SqlCommand cmd = new SqlCommand(query, sql))
    {
        sql.Open();
        int ff = 0;
        while (ff < 2000)
        {
            cmd.ExecuteNonQuery();//It takes 139 milliseconds approximately
            ff++;
            Console.WriteLine(ff);
        }

    }
}

Но когда я выполняю следующий сценарий в SSMS (Sql Server Management Studio), 2000 записей сохраняются за 15 секунд:

declare @i int;
set @i=1

while (@i)<=2000
begin
    set @i=@i+1
    INSERT INTO Fulls (ts,MOTOR,HMI,SET_WEIGHT) VALUES ('2018-07-04 02:56:57','0','0','0'); 
end

Что происходит? Почему так медленно исполняется предложение?

Дополнительно:

- База данных является базой данных SQL, размещенной в Microsoft Azure.

- Скорость загрузки моего интернета составляет 20 Мбит.

-Приведенный выше запрос не является реальным запросом, настоящий запрос содержит 240 столбцов и 240 значений.

-Я попытался выполнить транзакцию, следуя этому примеру: https://msdn.microsoft.com/en-us/library/86773566(v=vs.110).aspx

- переменная sql имеет тип SqlConnection.

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Убедитесь, что количество таблиц в таблице минимально, и используйте SqlBulkCopy, как показано ниже

DataTable sourceData=new DataTable();
using (var sqlBulkCopy = new SqlBulkCopy(_connString))
{
    sqlBulkCopy .DestinationTableName = "DestinationTableName";
    sqlBulkCopy .WriteToServer(sourceData);
}
0 голосов
/ 05 июля 2018

Похоже, что между вашим SQL-сервером и сервером приложений существует большая задержка. Когда я делаю это локально, чистая версия TSQL выполняется за 363 мс, а версия C # с 2000 обходами занимает 1061 мс (так: около 0,53 мс за прием). Примечание: я забрал Console.WriteLine, потому что не хотел измерять, насколько быстро Console нет!

Для 2000 вставок это довольно справедливое сравнение. Если вы видите что-то совершенно другое, то я подозреваю:

  • ваш SQL-сервер ужасно недостаточно загружен - ему не нужно 15 секунд (из вопроса), чтобы вставить 2000 строк при любых обстоятельствах (время 363 мс на моем рабочем столе ПК, а не быстрый сервер)
  • как уже предлагалось; у вас высокая задержка

Обратите внимание, что есть также такие вещи, как "DTC", которые могут повлиять на производительность, основанную на строке подключения и окружающих транзакциях (TransactionScope), но я предполагаю, что это не факторы здесь.

Если вам нужно улучшить производительность здесь, первое, что нужно сделать, это выяснить , почему это так ужасно - то есть производительность необработанного сервера ужасна , и задержка огромна . Ни один из них не является вопросом кодирования: это вопросы инфраструктуры.

Если вы не можете это исправить, вы можете написать код вокруг них. Табличные значения параметров или массовая вставка (SqlBulkCopy) предоставляют способы переноса нескольких строк без необходимости оплачивать туда-обратно за выполнение. Вы также можете использовать «MARS» (несколько активных наборов результатов) и конвейерные вставки, но это довольно сложная тема (и большинство людей, как правило, рекомендуют не включать MARS).

...