Вы не можете сделать это быстрее, но вы можете сделать это без проблем.Первый вариант - создать отдельную задачу, которая порциями переносит данные из источника в архивные таблицы.Чтобы не допустить повышения блокировки таблиц и общего снижения производительности, я бы предложил ограничить размер одной транзакции.Например, запустить транзакцию, вставить N записей в архивную таблицу, удалить эти записи из исходной таблицы, зафиксировать транзакцию.Продолжайте в течение нескольких дней, пока все необходимые данные не будут переданы.Преимущество этого способа заключается в том, что в случае какого-либо сбоя вы можете перезапустить процесс архивирования, и он продолжится с момента сбоя.
Второй вариант, который на самом деле не исключает первыйзависит от того, насколько критична для вас производительность исходных таблиц и сколько обновлений происходит с ними.Если это не проблема, вы можете написать триггеры, которые фактически помещают каждую вставленную / обновленную запись в архивную таблицу.Затем, когда вы хотите выполнить очистку, все, что вам нужно сделать, это удалить устаревшие записи из исходных таблиц, их копии уже будут в архивных таблицах.
В обоих случаях вам не нужно будет иметь какие-либопростои.