Рекомендовать использование временной таблицы или табличной переменной в Entity Framework 4. Обновление производительности Entity Framework - PullRequest
11 голосов
/ 19 февраля 2011

Мне нужно обновить битовое поле в таблице и установить для этого поля значение true для определенного списка идентификаторов в этой таблице.

Идентификаторы передаются из внешнего процесса.

Я полагаю, что в чистом SQL наиболее эффективным способом было бы создать временную таблицу и заполнить ее идентификаторами, затем присоединить к ней основную таблицу и соответственно установить битовое поле.

Я мог бы создать SPROC длявозьмите идентификаторы, но может быть задействовано 200–300 000 строк, которым нужен этот флаг, так что это, вероятно, не самый эффективный способ.Использование оператора IN имеет ограничение по объему данных, которые могут быть переданы, и производительности.

Как я могу достичь вышеуказанного, используя Entity Framework

Я предполагаю, что возможно создать SPROC для созданиявременная таблица, но она не будет существовать с точки зрения моделей.

Есть ли способ динамически добавлять объекты во время выполнения.[Или этот подход просто вызовет головную боль].

Я делаю предположение выше, хотя заполнение временной таблицы 300 000 строк и выполнение соединения будет быстрее, чем вызов SPROC 300 000 раз :) [Идентификаторы являются направляющими]

Есть ли другой подход, который я должен рассмотреть.

Ответы [ 2 ]

16 голосов
/ 19 февраля 2011

Для таких объемов данных, как 300 тыс. Строк, я бы забыл EF.Я бы сделал это, имея такую ​​таблицу:

BatchId  RowId

Где RowId - это PK строки, которую мы хотим обновить, а BatchId просто ссылается на этот «прогон» из 300 тыс. Строк (дляодин раз и т. д.).

Я бы сгенерировал новый BatchId (это может быть что-то уникальное;Затем я бы использовал simgle sproc для объединения и обновления (и удаления пакета из таблицы).

SqlBulkCopy - это самый быстрый способ передачи этого объема данных на сервер;Вы не утонете в поездках туда и обратно.EF является объектно-ориентированным: отлично подходит для множества сценариев, но не для этого.

4 голосов
/ 21 февраля 2011

Я присваиваю ответ Марка в качестве ответа, но я бы хотел немного рассказать о том, как мы реализовали это требование. Ответ Марк очень помог в формулировании нашего решения.

Нам приходилось иметь дело с целью / руководством, чтобы придерживаться Entity Framework, не используя SPROCS, и хотя наше решение может не подходить другим, оно работало для нас

Мы создали таблицу элементов в базе данных с колонками BatchId [uniqueidentifier] и ItemId varchar.

Эта таблица была добавлена ​​в модель EF, поэтому мы не использовали временные таблицы.

При загрузке этих идентификаторов эта таблица заполняется идентификаторами [Вставки выполняются достаточно быстро, мы находим EF]

Затем мы используем context.ExecuteStoreCommand для запуска SQL, чтобы объединить таблицу элементов и основную таблицу и обновить битовое поле в основной таблице для записей, которые существуют для идентификатора пакета, созданного специально для этого сеанса.

Мы наконец очищаем эту таблицу для этого batchId.

У нас есть производительность, не выходящая за рамки нашей цели SPROC. [Что не из нас согласны с :), но это демократия]

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

Ли

...