Подумайте о создании новой таблицы с той же схемой и столбцом версии строки и добавьте представление поверх обеих таблиц, которое объединяет все. Попросите людей использовать представление и написать вместо триггеров соответствующие таблицы и представления.
Вставки должны отправляться в новую таблицу, обновления должны перемещать данные в новую таблицу, а удаления должны применяться к обеим таблицам.
Затем выполните групповые перемещения в фоновом режиме, перемещая столько записей за раз, сколько сможете, к новой таблице. У вас все еще могут быть проблемы с параллелизмом, пока это происходит, и некоторые дурацкие планы выполнения, но это позволяет вам оставаться в сети, пока происходят движения.
В идеале вы должны начать процесс в пятницу днем, чтобы минимизировать влияние на конечных пользователей, и попытаться выполнить его до утра понедельника. Как только это будет на месте, вы можете изменить представление так, чтобы оно указывало только на новую таблицу, и планы выполнения дерьма исчезли. Идеально.
Чтобы избежать срабатывания триггеров при переносе данных в пакетах, посмотрите на количество строк в удаленных / вставленных таблицах в триггере и пропустите действия, если они близки к числу строк в вашем пакете.
В конце концов Майкл решил пропустить представление (а не удалять из исходной таблицы), чтобы получить более стабильные планы. Компромисс держал в основном две копии таблицы. Он превратил это в серию постов в блоге .