Я нахожу эту проблему интересной отчасти потому, что я пытаюсь сделать что-то подобное в принципе, но также потому, что я не видел сверхинтуитивного отраслевого стандартного решения.Еще.
То, что вы предлагаете сделать, сработает, если вы правильно напишите свой SQL-запрос.Использование ROW_NUMBER / BETWEEN
должно быть достижимо.Я напишу и задокументирую здесь некоторые другие альтернативы, а также преимущества / предостережения.
Параллельная обработка
Я понимаю, что вы хотите сделать это в SQL Server, но в качестве справки Oracle реализовалэто как ключевое слово, которое вы можете запросить вещи параллельно.
Документация: https://docs.oracle.com/cd/E11882_01/server.112/e25523/parallel002.htm
SQL реализует это по-другому, вам нужно явно включить его через более сложное ключевое слово, и вы должны использовать определенную версию:
Хорошая статья на эту тему здесь: https://www.mssqltips.com/sqlservertip/4939/how-to-force-a-parallel-execution-plan-in-sql-server-2016/
Вы можете объединить параллельную обработку с интеграцией SQL CLR, которая будет эффективно делать то, что вы пытаетесь делать в SQL, пока SQL управляет блоками данных, а не выв ваших потоках.
Интеграция с SQL CLR
Одна приятная особенность, на которую вы можете обратить внимание, - это выполнение кода .net на SQL-сервере.Документация здесь: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration
Это, в основном, позволит вам запускать код C # на вашем SQL-сервере, сохраняя вас при чтении / обработке / записи туда и обратно.Они также улучшили непрерывную интеграцию в этом отношении - документация здесь: https://docs.microsoft.com/en-us/sql/integration-services/sql-server-integration-services?view=sql-server-2017
Просмотр QoS / получение журналов на случай, если что-то пойдет не так, на самом деле не так просто, как справиться с этим на рабочем месте, хотяк сожалению.
Используйте один поток (если вы читаете из внешнего источника)
Параллелизм полезен только при соблюдении определенных условий.Ниже приведена документация Oracle, но она также относится к MSSQL: https://docs.oracle.com/cd/B19306_01/server.102/b14223/usingpe.htm#DWHSG024
Параллельное выполнение улучшает обработку для:
- Запросы, требующие сканирования больших таблиц, объединений или многораздельного индексасканы
- Создание больших индексов
- Создание больших таблиц (включая материализованные представления)
- Массовое вставление, обновление, объединение и удаление
Существуют также требования к настройке / среде
Преимущества параллельного выполнения имеют все следующие характеристики:
- Симметричные мультипроцессоры (SMP), кластеры или массивно параллельныесистемы
- Достаточная пропускная способность ввода / вывода
- Недостаточно загруженные или периодически используемые процессоры (например, системы, в которых загрузка процессора обычно составляет менее 30%)
- Достаточная память для поддержки дополнительной памяти-интенсивные процессы, такие как сортировка, хеширование и буферы ввода / вывода
Существуют и другие ограничения.Когда вы используете несколько потоков для выполнения предложенной вами операции, если один из этих потоков будет убит / не смог что-то сделать / сгенерирует исключение и т. Д., Вам абсолютно необходимо будет справиться с этим - так, чтобы вы сохраняли его допоследний индекс, который вы обработали - чтобы вы могли повторить остальные записи.С одним потоком это становится намного проще.
Заключение
Предполагая, что БД смоделирована правильно и не может быть оптимизирована даже дальше Я бы сказал, что самое простое решение - это лучший поток.Проще регистрировать и отслеживать ошибки, проще реализовывать логику повторных попыток, и я бы сказал, что они значительно перевешивают преимущества, которые вы получите от параллельной обработки. Вы можете посмотреть бит параллельной обработки для пакетных обновлений, которые вы сделаетек БД, но если у вас не будет CLR DLL в SQL - который вы будете вызывать его методы параллельно, я не вижу побочных преимуществ.Ваша система должна вести себя определенным образом и в то время, когда вы выполняете параллельный запрос, чтобы она была более эффективной.
Конечно, вы можете спроектировать свою рабочую роль асинхронной и не блокировать обработку каждой записи.Таким образом, вы по-прежнему будете многопоточными, но ваши запросы будут выполняться в одном потоке.
Изменить на заключение
После разговора с моим коллегой по этому вопросу сегодня, этоСтоит добавить, что даже при использовании однопоточного подхода вы должны иметь возможность восстанавливаться после сбоя, поэтому в принципе наличие нескольких потоков против одного потока в соответствии с требованием восстановления / постепенного сбоя и запоминания того, что вы обработали не меняется.Однако, как вы восстановитесь, если учесть, что вам придется писать более сложный код для отслеживания нескольких потоков и их состояний.