«Периодически», о котором вы упомянули, звучит как работа с базой данных, запуск которой запланирован ... Я не знаю, как часто. Один раз в день? Каждые 2 часа? Вы решаете.
Процедура может выглядеть следующим образом:
update table set cb_to_be_moved = 1 where status = 'COMPLETED';
insert into table_bakup (col1, col2, ...)
select col1, col2, ...
from table
where cb_to_be_moved = 1;
delete from table where cb_to_be_moved = 1;
Почему cb_to_be_moved
? Так как затронуты миллионы строк, между вашими операторами insert
и delete
могут быть некоторые другие строки, для которых установлено, что они "завершены" (и эти транзакции зафиксированы). Если вы используете идентификаторы, да - это работает, но - вы должны сравнить миллионы строк в table
с миллиардами строк в table_bakup
, поэтому этот (cb_to_be_moved
) подход может быть быстрее.
Триггер базы данных? Да, но - представьте себе, что происходит, когда она запускается для миллионов строк ... база данных может удушить . А может и нет;попробуй проверить это.