2013-11-18 4 views
0

У меня есть следующие настройки:Entity framework - сколько времени потребуется, чтобы добавить 75k строк?

  • Table1 - 150К строк в настоящее время, нужно добавить еще 25k строк,
  • TABLE2 - 300k строк, нужно добавить еще один 50k.

добавить строки в цикле, как и (EF-код первого):

using (var context = new MyDb()) 
{ 
    loop() //25k rounds 
    { 
    var t3 = new Table2(); 
    var t2 = new Table2(); 
    var t1 = new Table1{prop1 = t2, prop2 = t3}; 
    context.Table1.Add(t1); 
    context.SaveChanges(); 
    } 
} 

Таким образом, цикл будет принимать 25k оказывается в общей сложности, и мое измерение производительности показывает мне, что это добавит эти строки примерно в десять часов! И теперь я понятия не имею, если это потому, что это нормальное время для такого рода операций с EF, или потому что что-то не так с моими dbms?

+2

Это одноразовая вещь? Если так, EF, вероятно, не лучший выбор здесь. Но я собираюсь голосовать за закрытие, потому что, как долго это происходит, это основано на множестве факторов, таких как тип базы данных/размер/дизайн/индексируются ли таблицы и т. Д., Я думаю, слишком много, чтобы дать какой-либо вид полезный ответ. – JMK

+0

Я бы предположил, что вы не должны «SaveChanges» каждый раз. Может быть, сделать это в 1к кусках? –

+1

Переместить замкнутый цикл 'SaveChanges'? – Kami

ответ

3

Посмотрите на этот ответ на аналогичный вопрос

Fastest Way of Inserting in Entity Framework

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

+0

Я не смотрел на это так, это, безусловно, поможет, спасибо! – ojek

+0

Вы должны включить сводку, цитату, соответствующий код или пример его кода, модифицированного для его реализации. Не просто ссылка и краткое резюме, которое у вас есть. –

3

EF не предназначен для эффективного массового обновления/вставки. Я бы рекомендовал использовать другой метод, как BCP (утилита командной строки для импорта из текстовых файлов), SqlBulkCopy формы C# (которая в основном .NET обертка для BCP или инструмент ETL, как SSIS.

Если вы производящих данные в вашей программе (не копируя его формируют другую locaiton), то вы можете попытаться строить команду INSERT SQL и с помощью SqlCommand.

+0

Я загляну в него, может быть, полезно, спасибо! – ojek

Смежные вопросы