LINQ to SQL - как сделать так, чтобы это работало с базой данных быстрее - PullRequest
0 голосов
/ 21 января 2012

У меня проблема. Мои LINQ to SQL запросы передают данные в базу данных со скоростью ~ 1000 строк в секунду. Но это слишком медленно для меня. Объекты не сложны. Загрузка процессора составляет <10%, а пропускная способность не является узким местом. </p>

10% на клиенте, на сервере 0% или макс. 1%, как правило, вообще не работают, не пересекают индексы и т. Д.

Почему 1000 / с работают медленно, мне нужно что-то около 20000 / с - 200000 / с, чтобы решить мою проблему другим способом, я получу больше данных, чем могу рассчитать.

Я не использую транзакцию, но LINQ использую, когда я отправляю, например, объекты milion, новые объекты в DataContext и запускаю SubmitChanges(), тогда это вставляется во внутреннюю транзакцию LINQ.

Я не использую параллельные LINQ, у меня не так много вариантов выбора, в основном в этом сценарии я вставляю объекты и хочу использовать все ресурсы, у меня есть не только 5% ЦП и 10 КБ / с сети!

Ответы [ 3 ]

2 голосов
/ 22 января 2012

когда я публикую, например, объекты milion

Забудьте об этом.Linq2sql не предназначен для таких больших пакетных обновлений / вставок.

Проблема в том, что Linq2sql будет выполнять отдельный оператор вставки (или обновления) для каждой вставки (обновления).Этот тип поведения не подходит для таких больших чисел.

Для вставок вы должны заглянуть в SqlBulkCopy, потому что он на lot быстрее (и действительно на порядок быстрее).

1 голос
/ 21 января 2012

Некоторая оптимизация производительности может быть достигнута с помощью LINQ-to-SQL с использованием предварительно скомпилированных запросов. Большая часть затрат составляет фактический запрос.

http://www.albahari.com/nutshell/speedinguplinqtosql.aspx http://msdn.microsoft.com/en-us/library/bb399335.aspx

Также вы можете отключить отслеживание объекта, которое может дать вам миллисекунды улучшения. Это делается в текстовом тексте сразу после его создания.

0 голосов
/ 21 января 2012

Я тоже сталкивался с этой проблемой раньше.Я использовал решение Entity Framework.Здесь есть учебник .Одним из традиционных способов является использование LINQ-To-Entity, который имеет схожий синтаксис и бесшовную интеграцию объектов C #.Этот способ дал мне 10-кратное ускорение в моем впечатлении.Но более эффективный (по величине) способ - это написать оператор SQL самостоятельно, а затем использовать функцию ExecuteStoreQuery для извлечения результатов.Требуется написать SQL, а не операторы LINQ, но возвращаемые результаты все еще могут быть легко прочитаны C #.

...