Мне нужно загрузить несколько операторов SQL из SQL Server в DataTables. Большинство операторов возвращают от 10 000 до 100 000 записей, и загрузка каждого из них занимает до нескольких секунд. Я предполагаю, что это просто из-за количества данных, которые нужно перебрасывать. Обработка самих заявлений не занимает много времени.
Поэтому я попытался использовать Parallel.For() для параллельной загрузки данных, надеясь, что общее время обработки уменьшится. Я получаю увеличение производительности на 10%, но этого недостаточно. Причина может заключаться в том, что моя машина только двухъядерная, что ограничивает преимущество здесь. При этом сервер, на котором будет развернута программа, имеет 16 ядер.
Мой вопрос в том, как я могу улучшить производительность больше? Будет ли использование асинхронных запросов службы данных лучшим решением (BeginExecute и т. д.), чем PLINQ? Или, может быть, какой-то другой подход?
Сервер SQl работает на том же компьютере. Это также относится к серверу развертывания.
РЕДАКТИРОВАТЬ: я провел несколько тестов с использованием DataReader вместо DataTable. Это уже уменьшило время загрузки примерно на 50%. Здорово! Тем не менее мне интересно, улучшит ли параллельная обработка с BeginExecute общее время загрузки, если используется многопроцессорная машина. У кого-нибудь есть опыт в этом? Спасибо за любую помощь в этом!
ОБНОВЛЕНИЕ: я обнаружил, что около половины времени загрузки уходит на обработку инструкции sql. В SQL Server Management Studio операторы занимали лишь часть времени, но почему-то в ADO.NET они занимают гораздо больше времени. Таким образом, используя DataReaders вместо загрузки DataTables и адаптации операторов sql, я сократил примерно 25% первоначального времени загрузки. Загрузка DataReaders в параллельных потоках с помощью Parallel.For() здесь не дает улучшения. Так что пока я доволен результатом и на этом останавливаюсь. Возможно, когда мы обновимся до .NET 4.5, я попробую асинхронную загрузку DataReader.