Вот что я сделал (и это было намного быстрее):
- Я сбросил кластерный индекс.
- Я также сбросил внешние ключи
ссылки (две другие инт
столбцы).
- Я запустил оператор обновления
- Я пересоздал индекс, который оказался быстрее, чем ожидалось. (Это первоначальная причина, по которой я сначала спросил ТАК).
Это снизило весь процесс до считанных секунд. Да, ~ 1 миллион строк за 15 секунд.
Второй шаг был критически важным, потому что внешние ключи заставляли обновление выполнять какую-то буферизацию для связанных таблиц, каждая из которых также имеет большое количество строк.
Количество физических чтений утроилось из-за этих поисков внешнего ключа.
Я не уверен, почему SQL Server должен это делать, но я предполагаю, что он все еще выполняет проверку целостности, даже если я не обновляю этот столбец, но перемещаю всю строку (обновление кластеризованного столбца).
В качестве примечания я также попытался запустить обновление партиями:
update top(1000) t1
set t1.groupId = t2.groupId
from
table t1
join newtable t2 on t1.email = t2.email
Это было нормально (и казалось, что оно масштабировалось примерно до 10K на партию), но все равно было порядка 1-2 минут на каждую партию.
Итак, я узнал, что для массовых обновлений временное удаление индексов может быть очень полезным.