2015-09-25 6 views
1

Во-первых, я очень хорошо знаю, что есть много других статей, посвященных точной теме. Однако эти статьи старые. Например,Вложение Entity Framework 6 слишком медленное

Entity Framework is Too Slow. What are my options? это 4 года назад, и я предполагаю, что в рамках этой платформы было выпущено хотя бы одно крупное обновление версии, поэтому я надеюсь, что что-то новое и полезное поможет мне в этой теме.

Так что моя проблема в деталях, как это:

У меня есть источник данных, который я должен разобрать и вставить результаты в SQL Server. Поскольку разбор происходит так быстро, я думаю, что накладные расходы, очевидно, связаны с инфраструктурой сущности.

Мне нужно вставить данные в несколько десятков таблиц, около 80 из них. Каждая таблица имеет 8 столбцов, скажем, в среднем, среди которых есть столбец с автоинкрементным идентификатором. И каждый раз мне нужно вставить несколько тысяч строк в 20 таблиц. Поэтому некоторые таблицы огромные (возможно 100k строк?)

Таблицы имеют отношение между ними, что это просто форма звезды отношение, как это:

 
         table5 table6 
          \ /
      table3-----------\ \//-----------------table4 
     table1 ------------ record table ------------------ table2 

только представьте, основная таблица имеет 80 таблиц, вокруг него , 90% отношения - это 1-ко-многим, некоторые многие ко многим, ограниченные друг к другу.

Способ ввода: я добавляю весь результат в контекст с помощью метода AddRange, и я звоню SaveChanges раз в глобальном масштабе.

Я наблюдал эффективность ввода в текущих настройках, и я нашел в самом начале, вставка занимает несколько секунд, а затем минуты, теперь требуется 30 минут для вставки данных примерно в том же размере.

Итак, мой вопрос в том, что есть ли хороший способ повысить скорость вставки? Мне известно о массовой вставке, но у меня есть отношение наследования, поэтому я ищу любой другой способ, который не нарушит ограничение отношения.

Любые хорошие предложения или рекомендуемые хорошие профилировщики? Или это поможет в этой ситуации, если я определяю хранимую процедуру для обслуживания цели вставки? Извините, но на самом деле я только что узнал об этом в течение нескольких недель и ожидал, что это правильный инструмент для использования в бизнес-логике. Так голый со мной, если есть что-то, что хорошо известно в сообществе.

+1

Entity Framework, как ORM, умеет конвертировать таблицы в данные и наоборот. Однако преобразование данных из некоторого источника данных в объект только для его повторного преобразования в другое хранилище данных ужасно неэффективно. Были предприняты усилия, направленные на улучшение такого рода деятельности, но большинство согласны с тем, что это не совсем то, что должно быть сделано в любом виде ОРМ. – Claies

+0

@ Claies да, я согласен с тобой, и ни один мой босс не согласен с тобой. Я вынужден разбирать некоторые необработанные данные и помещать их в RMDBS, поэтому мне нужно будет сопоставить данные с реляционными данными для него и других ребята, чтобы запросить их в любом случае. поэтому, пожалуйста, сценарий не так уж важен. Я имею в виду, что конструкция данных и отношений здесь достаточно проста.Надеюсь, что я смогу получить помощь в том, как улучшить производительность вместо комментариев к архитектуре, и я ничего не могу изменить. пожалуйста, сосредоточьтесь только на моей проблеме. – HuStmpHrrr

+0

@Claies FYI, необработанные данные - это текст, читаемый человеком, и мне нужно преобразовать их в какое-то отношение, что является чистой болезненной работой. поэтому в таком контексте я полностью согласен с вашей точкой зрения. – HuStmpHrrr

ответ

1

Вам необходимо обновить свой контекст для каждой партии.

например:

foreach(var batch in batches){ 
    using(var ctx = new MyContext()){ 
     //do a batch 
     ctx.SaveChanges(); 
    } 
} 

Если вы пытаетесь повторно использовать контекст вы все равно будете отслеживания всех предыдущих записей, вставленных. График отслеживания экспоненциально медленнее обрабатывается на основе количества отслеживаемых объектов.

+0

спасибо. Я тоже это понимаю. У меня есть менеджер, который собирает все данные для вставки и вставки их одним выстрелом и распоряжается собой. Я вообще не использую контекста. так что я могу спросить, как вы исследуете эффективность EF и знаете, где улучшить? – HuStmpHrrr

+0

@HuStmpHrrr Я бы выбрал профайлер и проверил его, я использую смесь SQL Profiler (встроенный в SQL Server Management Studio) и EF Profiler (платный, но очень хороший и простой в использовании) –