Будет ли несколько соединений с базой данных из нескольких потоков приложения повысить производительность запросов на вставку? - PullRequest
2 голосов
/ 03 марта 2009

Здесь я имею дело с базой данных, содержащей десятки миллионов записей. У меня есть приложение, которое подключается к базе данных, получает все данные из одного столбца в таблице, выполняет некоторые операции над ним и обновляет его (для SQL Server - с помощью курсоров).

Для миллионов записей обновление занимает очень и очень много времени. Поэтому я хочу сделать это быстрее

  1. с использованием нескольких потоков с независимым соединением для каждого потока.

или

  1. путем использования одного соединения во всех потоках для запуска запросов на обновление.

Какой из них быстрее, или, если у вас есть другие идеи, объясните, пожалуйста.

Мне нужно решение, которое не зависит от типа базы данных, или даже если вы знаете конкретные решения для каждого типа БД, пожалуйста, ответьте.

Ответы [ 3 ]

3 голосов
/ 03 марта 2009

Ускорение, которое вы пытаетесь достичь, не сработает. Наоборот, это замедлит общую обработку, поскольку база данных теперь также должна поддерживать синхронизацию нескольких соединений / сеансов / транзакций.

Сохраняйте как можно меньше соединений / транзакций для повторяющихся и сопоставимых операций. Если это занимает слишком много времени на ваш вкус, возможно, попробуйте проанализировать, можно ли каким-то образом оптимизировать запросы. Также обратите внимание на специфичные для базы данных расширения (т.е. массовые операции), подходящие для вашей проблемы.

0 голосов
/ 03 марта 2009

Если возможно, попытайтесь использовать хранимую процедуру, выполните всю обработку и обновите записи.

0 голосов
/ 03 марта 2009

Все зависит от базы данных и оборудования, на котором она работает.

Если база данных может использовать параллельную обработку и избегать конфликтов на совместно используемых ресурсах (например, блокировки базы страниц будут охватывать несколько записей, на основе записей - нет). К общим ресурсам в этом случае относятся аппаратные средства, одноядерный блок не сможет выполнять несколько операций с интенсивным использованием ЦП (например, анализ SQL) по-настоящему параллельно.

Сетевая задержка - это то, что вы могли бы помочь уменьшить с помощью одновременных вставок, даже если сама база данных не способна использовать параллелизм.

Как и в случае с любым вопросом производительности, в вашем конкретном сценарии можно заменить тестирование.

...