Рекомендуется использовать временную таблицу или переменную таблицы в Entity Framework 4. Обновление Performance Entity framework

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

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

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

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

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

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

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

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

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

2 ответов


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

BatchId  RowId

где RowId-это ПК строки, которую мы хотим обновить, а BatchId просто ссылается на этот "запуск" строк 300k (чтобы разрешить несколько сразу и т. д.).

Я бы сгенерировал новый BatchId (это может быть что-то уникальное-Guid прыгает на ум) и использовал SqlBulkCopy для вставки записей te в эту таблицу, т. е.

100034   17
100034   22
...
100034   134556

затем я бы использовал simgle sproc, чтобы сделать соединение и обновление (и удаление пакета из таблицы).

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


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

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

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

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

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

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

мы, наконец, очистить этот стол для этого идентификатора партии batchid.

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

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

Лиам