Удаление большого количества записей занимает ОЧЕНЬ долгое время
У меня есть таблица базы данных (работает на 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).
-
Это похоже на нормальное поведение?
-
любые идеи о том, что я могу сделать, чтобы сократить время работы?
Спасибо,
Ответы
Ответ 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. Его можно запустить, например, один раз в день в самый тихий период.