#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. Как только я найду лучшее решение, я опубликую его здесь.
Скоро последует…