Подтвердить что ты не робот

Удаление большого количества записей занимает ОЧЕНЬ долгое время

У меня есть таблица базы данных (работает на SQL Server 2012 Express), которая содержит ~ 60 000 строк.

Я использую следующий код для очистки старых строк:

//Deleting CPU measurements older than (oldestAllowedTime)
var allCpuMeasurementsQuery = from curr in msdc.CpuMeasurements where 
    curr.Timestamp < oldestAllowedTime select curr;
foreach (var cpuMeasurement in allCpuMeasurementsQuery)
{
  msdc.CpuMeasurements.Remove(cpuMeasurement);
}

Когда количество удаленных строк велико (~ 90% или более записей в таблицах удаляются), операция выполняется исключительно долго. Для завершения этой операции требуется примерно 30 минут на относительно сильной машине (рабочий стол Intel I5).

  • Это похоже на нормальное поведение?

  • любые идеи о том, что я могу сделать, чтобы сократить время работы?

Спасибо,

4b9b3361

Ответ 1

Структура Entity не очень хороша при обработке массовых операций, подобных этому. Вы должны использовать ExecuteStoreCommand для выполнения SQL непосредственно против источника данных в таких ситуациях.

var deleteOld = "DELETE FROM CpuMeasurements WHERE curr.Timestamp < {0}";
msdc.ExecuteStoreCommand(deleteOld, oldestAllowedTime);

Таким образом, вам не нужно загружать объекты в память (только для их удаления) и выдавать тысячи команд удаления в базу данных.

Ответ 2

Вы должны посмотреть EntityFramework.Extended, который был создан, чтобы помочь как для массового удаления, так и для обновлений.

Используя это, вы можете просто сделать:

msdc.CpuMeasurements.Delete(curr => curr.Timestamp < oldestAllowedTime);

Ответ 3

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

EntityFramework.extended может обрабатывать этот сценарий.

Ответ 4

Удаление огромных объемов данных может занять много времени.

Вам может потребоваться переместить sql из вашего приложения и запустить его как один sql script через Агент SQL Server. Его можно запустить, например, один раз в день в самый тихий период.