Принято считать, что обработка таблиц на основе наборов всегда должна быть предпочтительнее, чем RBAR, особенно когда таблицы увеличиваются в размерах и / или вам необходимо обновить много строк.
Но так ли это всегда? Я сталкивался с довольно многими ситуациями - на разных аппаратных средствах - когда обработка на основе наборов демонстрирует экспоненциальный рост затрат времени, а разделение одной и той же рабочей нагрузки на более мелкие порции дает линейный рост.
Я думаю, что было бы интересно либо оказаться полностью неправым - если я упустил что-то очевидное - либо, если нет, было бы очень полезно узнать, стоит ли разделять рабочую нагрузку. И впоследствии определение того, какие показатели помогают принять решение о том, какой подход использовать. Я лично ожидаю, что следующие компоненты будут интересны:
- Размер рабочей нагрузки
- Размер и рост файла журнала
- Объем оперативной памяти
- Скорость дисковой системы
Любой другой? Количество процессоров / процессорных ядер?
Пример 1. У меня есть таблица на 12 миллионов строк, и мне нужно обновить одно или два поля в каждой строке данными из другой таблицы. Если я сделаю это за одно простое ОБНОВЛЕНИЕ, это займет ~ 30 минут на моем тестовом боксе. Но я закончу через ~ 24 минуты, если я разделю это на двенадцать кусков - то есть .:
WHERE <key> BETWEEN 0 AND 1000000
WHERE <key> BETWEEN 1000000 AND 2000000
...
Пример 2: таблица из 200 с лишним миллионов строк, в которой также необходимо выполнить несколько вычислений практически для всех строк. Если сделать полный набор все в одном, мой ящик будет работать в течение трех дней и даже тогда не будет сделано. Если я напишу простой C # для выполнения точно такого же SQL, но с добавленными WHERE-предложениями для ограничения размера транзакции до 100 тыс. Строк за раз, это будет сделано за ~ 14 часов.
Для справки: мои результаты получены из тех же баз данных, основанных на том же физическом оборудовании, с обновленной статистикой, без изменений в индексах, простой моделью восстановления и т. Д.
И нет, я не пробовал «настоящий» RBAR, хотя мне, вероятно, следовало бы - хотя бы было только посмотреть, сколько времени это действительно займет.