скрипт для удаления миллионов строк из таблицы оракула в зависимости от возраста или даты

Есть ли возможность написать скрипт в оракуле, который удаляет строки из таблицы в зависимости от возраста. т. е. я хочу удалить строки s. У меня есть таблица с миллионами строк, и я хочу сохранить только последние 3 месяца. У меня есть следующая таблица с именами столбцов как

Я очень новичок в базах данных. Как я могу написать сценарий для этого?


person Raghavendar    schedule 16.01.2012    source источник
comment
Попробуйте сами, но сделайте это как запрос «выбрать», чтобы проверить предложение where. как только вы убедитесь, что данные выглядят правильно, сделайте резервную копию, а затем переключитесь на фактический запрос «удалить».   -  person Marc B    schedule 16.01.2012
comment
ORA_ROWSCN, я не уверен, поддерживается ли он в Oracle9i   -  person Emmanuel N    schedule 16.01.2012
comment
@Raghavendar - Каков тип данных FEED_DT_TM? Если это DATE, вы не хотите вызывать на нем TO_DATE. Если это VARCHAR2, вы почти наверняка захотите использовать маску формата, соответствующую формату строки. С точки зрения модели данных это должен быть DATE.   -  person Justin Cave    schedule 17.01.2012
comment
Тип данных FEED_DT_TM — Дата.   -  person Raghavendar    schedule 17.01.2012
comment
@Justin - лучше написать один запрос для выполнения вышеуказанной операции или скрипт. Так как я хочу сохранить в таблице данные только за первые 2 месяца.   -  person Raghavendar    schedule 17.01.2012
comment
@Marc B: сначала я попытался использовать оператор select вместо удаления. Это сработало для меня. Но мне нужно включить это в сценарий, и что мне нужно учитывать при написании сценария. пожалуйста, порекомендуйте   -  person Raghavendar    schedule 17.01.2012


Ответы (3)


При таком количестве строк, удаленных за одну транзакцию, вы также должны предсказать, что будет использовано много места для отмены. Все строки, которые вы удаляете, будут кратковременно сохранены в табличном пространстве отмены, чтобы вы могли откатить транзакцию и, что более важно, позволить другим пользователям видеть строки, пока вы не СОВЕРШИТЕ удаление. См. эту ветку asktom за советом.

person kubanczyk    schedule 17.01.2012

Поскольку FEED_DT_TM является DATE, нет необходимости использовать TO_DATE для приведения его к DATE. Просто

DELETE FROM your_table_name
 WHERE sysdate - feed_dt_tm >= 120
person Justin Cave    schedule 16.01.2012
comment
Большое спасибо . Я все еще не понимаю, следует ли использовать один оператор удаления, чтобы удалить около 12 миллионов строк из моей таблицы. Есть ли способ выполнить одну и ту же операцию по-разному, например, написать сценарий и запустить его. Я обеспокоен тем, что для выполнения вышеуказанной операции удаления требуется больше времени. - person Raghavendar; 17.01.2012
comment
@Raghavendar - есть и другие способы удалить большое количество строк. Однако эти способы будут занимать больше времени, потреблять больше ресурсов, и их будет сложнее писать и тестировать. Один оператор DELETE является наиболее эффективным способом удаления большого количества строк. - person Justin Cave; 17.01.2012
comment
Спасибо, сэр. Теперь мои опасения развеялись. Я выполню описанную выше операцию после обсуждения ее с моим администратором баз данных. На самом деле, мой администратор базы данных попросил меня написать сценарий вместо оператора удаления, я дам ему знать. - person Raghavendar; 17.01.2012

Также рассмотрите вариант сохранения нужных вам строк в новой таблице, а затем удаление старой таблицы.

Что-то типа..

create table new_table_2_months
as
select * 
  from table1
  where date_column > (sysdate-60)

drop table table1;

alter table new_table_2_months rename to table1;

Убедитесь, что вы также просматриваете ограничения, индексы и другие объекты, если они применимы к исходной таблице. И не забывайте ТЕСТИРОВАНИЕ, ТЕСТИРОВАНИЕ, ТЕСТИРОВАНИЕ.

person Rajesh Chamarthi    schedule 17.01.2012