2012-01-21 2 views
0

У меня проблема. Мои запросы LINQ to SQL подталкивают данные к базе данных со скоростью ~ 1000 строк в секунду. Но для меня это слишком медленно. Объекты не сложны. Использование ЦП < 10%, а пропускная способность также не является узким местом.LINQ to SQL - Как это сделать с базой данных быстрее

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

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

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

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

+2

Почему 1000 строк в секунду слишком медленно? Потребление процессора составляет 10% на сервере или клиенте? Вы сделали трассировку на сервере? – Stu

+2

Запись в 1000 строк в секунду - это респектабельная скорость, особенно для сильно индексированных таблиц или таблиц с триггерами. Если вы считаете, что можете идти быстрее, попробуйте сырые вызовы ado.net и посмотрите, поможет ли это (я сомневаюсь). – dasblinkenlight

+0

Используете ли вы транзакции на SQL-сервере? –

ответ

2

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

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

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

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

+0

true, забудьте, что это хорошее решение, производительность в linq не существует, и я ничего не могу с этим сделать, на sqlbulk копирование работает намного быстрее. – Svisstack

+0

Linq отлично подходит для выбора и/или манипуляции несколькими объектами, хотя , Я использую его много и в целом счастлив. Но для моих партийных вставок (я делаю 120 миллионов вставок в партии) я избегаю этого. – Pleun

1

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

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

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

0

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

+0

Ничего себе, когда вы говорите правду с этим 10-кратным ускорением, вы принимаете. Я попробую, что – Svisstack

Смежные вопросы