Проблемы с производительностью EF 4.1 Sql CE

#c# #entity-framework-4.1 #sql-server-ce

#c# #entity-framework-4.1 #sql-server-ce

Вопрос:

Я знаю, сегодня вечером я в режиме вопросов,

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

Мое приложение позволяет пользователям добавлять операции. В моих тестах я добавил только небольшие (тестовые) операции, которыми легко управлять. Каждая операция добавляется в хранилище данных, которое в настоящее время является базой данных SQL CE 4.0 (доступ к которой осуществляется сначала с помощью кода EF 4.1, что замечательно).

Теперь я протестировал приложение, используя обычную операцию, которая больше (приблизительно 4000 строк в базе данных). Вместо того, чтобы тратить несколько секунд, на самом деле вставка занимает несколько минут! В большой таблице есть только 1 внешний ключ и, конечно, первичный ключ, но, похоже, 4000 строк для этого слишком много.

Все строки вставляются в 1 пакет, и реальная нехватка производительности связана с командой SaveChanges.

Я сожалел об использовании ручных запросов (не тестировал), но это не предпочтительный вариант, поскольку транзакции не поддерживаются, и это должна быть изолированная операция.

Итак, нужна ли мне здесь новая стратегия? На SQL Server 2008 вы можете выполнить массовую вставку, но, по-видимому, это также не поддерживается Sql Server CE.

Какие клиентские решения такие же гибкие, как SQL Server CE, и легковесные? (например, Конечно, я не хочу, чтобы пользователь устанавливал SQL Server или использовал некоторые собственные компоненты).

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

Заранее спасибо!

Комментарии:

1. Много ли индексов в вставляемой таблице или много соединений? 4000 строк кажутся ужасно маленькими для того, чтобы вставка заняла несколько минут.

2. Нет, нет индекса, только 1 внешний ключ и 1 первичный ключ. На самом деле, есть только 4 столбца, которые представляют собой всего 4 целых числа

3. Проблема в том, что у меня нет intellitrace и я действительно не могу видеть, что происходит внутри SaveChanges. Я просто вижу, что там тратится время и только с большим набором данных

Ответ №1:

Вопрос в том, насколько медленной обычно является операция вставки в SQL CE? Проблема с EF заключается в том, что она не запрашивает один пакет для вставки 4000 записей, а вставляет записи одну за другой. Текущая версия EF не поддерживает пакетную обработку команд, поэтому вы выполняете 4000 вставок в последовательности. Это проблема и на большом сервере SQL, но обычно он выполняется быстрее. Я смог вставить около 50.000 — 100.000 более сложных записей в SQL Server в течение шести минут на более медленном рабочем столе и в течение трех минут на сервере.

Ответ №2:

http://msdn.microsoft.com/en-us/magazine/gg490349.aspx

это не конкретный ответ на вашу проблему, но эти методы определенно помогут вам устранить неполадки в ваших запросах.

Ответ №3:

Оба ответа были полезными, но не давали решения.

Я нашел это: http://sqlcebulkcopy.codeplex.com / который предоставляет класс SqlCeBulkCopy, который работает и выполняет вставку в течение 2 секунд!. Сейчас я работаю над интеграцией его в мой текущий репозиторий и модель unitofwork. Как только я найду лучшее решение, я опубликую его здесь.

Скоро последует…