Я бы предложил сделать это в рамках процедуры базы данных, если это возможно. В противном случае, вероятно, не имеет значения, насколько эффективна ваша обработка на стороне клиента, время будет зависеть от сортировки данных по сети. Даже если вы запускаете процесс на той же машине, вы можете понести наказание за сериализацию всего через драйвер (предположительно ODBC). Если, конечно, вы не напишите собственную процедуру, которая может выполняться в адресном пространстве вашего сервера базы данных (если ваш сервер поддерживает это).
Полагаю, я бы предложил написать процедуру, которая принимает нижнюю и верхнюю границу для выбора записей, затем написать программу на стороне клиента, которая разветвляет несколько потоков, выделяет соединение с БД для каждого потока, а затем вызывает на стороне сервера. процедура с границами соответствующего размера (скажем, пять нитей с четырьмя миллионами рядов в каждой). Если ваш сервер БД многопоточный, то это должно дать вам приличную производительность.
Однако при любом многопоточном подходе имейте в виду, что если вы обновляете много строк, вы можете столкнуться с проблемами блокировки из-за эскалации блокировки, если не выполняете транзакции достаточно часто.