Предполагая, что удаление удаляет значительную часть данных и миллионы строк, подойдите к трем:
create table tmp
Delete from A where to_date(last_updated,''yyyy-mm-dd'')< sysdate-7;
drop table a;
rename tmp to a;
https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:2345591157689
Очевидно, вам нужно скопироватьвсе индексы, гранты и т. д. Но переопределение в режиме онлайн может помочь в этомперейдите к 12.2, есть еще один более простой вариант: отфильтрованное перемещение.
Это операция изменения таблицы с дополнительным предложением, указывающим, какие строки вы хотите сохранить:
create table t (
c1 int
);
insert into t values ( 1 );
insert into t values ( 2 );
commit;
alter table t
move including rows where c1 > 1;
select * from t;
C1
2
Пока вывы ждете обновления до 12.2+ и если по какой-то причине вы не хотите использовать метод create-as-select, подход 1 лучше:
- Оба метода удаляют одинаковые строки из A* => это тот же объем работы, что и при удалении
- Вариант 1 имеет одно утверждение;Вариант 2 имеет два утверждения;2> 1 => опция 2 - это больше работы
* Согласованность на уровне операторов означает, что при выполнении процессов могут быть получены разные результаты.Скажем, другой сеанс пытается обновить старую строку, которую удалит ваш процесс.
С помощью только удаления обновление будет заблокировано до завершения удаления.В этот момент строка исчезла, поэтому обновление ничего не делает.
Принимая во внимание, что если вы выполняете вставку первой, другой сеанс может обновить и зафиксировать строку до завершения вставки.Таким образом, обновление "успешно".Но удаление тогда удалит это!Что может привести к несчастным клиентам ...