2015-03-30 2 views
0

Моя задача - оптимизировать довольно тяжелый запрос (~ 10 000 строк). Я хотел бы использовать многопоточность, поэтому каждый из потоков обрабатывал и возвращал определенный диапазон данных, например, я создавал 3 потока. 1-я строка обрабатывает и возвращает первые 100 строк, 2nd - next 100 rows, 3rd - next 100 rows Когда поток завершил работу, он занимает следующие 100 строк и так далее, пока не будет возвращено больше данных.Параллельные sql-запросы без параллельной библиотеки задач?

Я читал о TPL, но он был родной функциональностью с .NET 4.0, но мой проект основан на 3.5. Также я читал о Reactive library, которая имеет функциональность TPL для .NET 3.5, но не смогла заставить ее работать для меня.

Это сводится к следующему: как разбить запрос на куски, который может быть выполнен несколькими потоками? (Возможно, в цикле)

PS Я предпочитаю LINQ, но простой текстовый скрипт является приемлемым, а

+1

Это * не * тяжелый запрос, если он занимает слишком много времени, вы должны проверить свои индексы и SQL-запросы. –

+0

Задача, над которой я работаю, станет базой для реального программного обеспечения с миллионами строк. Я согласен с вами, 10k действительно не так уж тяжело. Этот код должен быть способен обрабатывать гораздо более тяжелые запросы, хотя :) –

+0

Тяжелые запросы лучше всего обрабатываются сервером базы данных. Почему вы хотите вывести все данные на стороне клиента для обработки? Если у вас сценарий ETL, почему бы не использовать SSIS? Он построен именно для этой цели. –

ответ

0

Таким образом, после некоторых мастерить я нашел довольно простой способ для достижения многопоточной обработки запросов без TPL на .NET Framework 3.5

Мой подход:

  • Получить общее количество строк таблицы
  • подсчет размер Пакетный = количество строк/нить
  • Создайте потоки, чтобы каждый из них получал определенное подмножество строк в зависимости от размера партии. Информация для SQL servers < 2012 Here и 2012+ Here (пример: таблица содержит 300 строк, мы используем 3 потоков, каждый поток будет возвращать партию из 100 строк)
  • Пуск все темы и ждать их, чтобы закончить (я использовал флаг)
  • Утилизируйте потоки
  • Не забудьте добавить «MultipleActiveResultSets = True» (MARS) при написании вашей строки подключения или конфигурации соединения db. Это позволит использовать несколько партий по одному соединению.

Это хорошо работает для меня. Прокомментируйте это, если у вас есть лучшая идея о том, как обращаться к многопоточным запросам на .NET 3.5

+0

Почему вы хотите обрабатывать результаты на стороне клиента, как это? 10k - это * маленький * результирующий набор, пейджинг вообще не нужен. Очень быстрым и грязным решением было бы загрузить все данные в память, а затем использовать несколько потоков для его обработки.«Параллельные запросы» имеют смысл только для загрузочных операций с терабайтным размером –

+0

@PanagiotisKanavos ответил в вопросе комментариев –

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