Уборка на столе истории

#sql #oracle #plsql

Вопрос:

У меня есть хранимая процедура, в которой я сохраняю в исторической таблице данные из другой таблицы. Однако я не хочу, чтобы моя историческая таблица стала слишком большой, и хотел бы удалить записи, которые старше 1 недели. Каков был бы наилучший подход для достижения этой цели?

 INSERT INTO table_h
    SELECT
        *
    FROM
        table;

COMMIT;
 

Комментарии:

1. Не зная полей, которые у вас есть в TABLE_H, невозможно ответить на этот вопрос. НАДЕЮСЬ, у вас есть поле ADD_DATE или подобное, которое вы можете использовать для очистки таблицы.

2. @banana_99 У вас есть лицензия на секционирование? Это дополнительный вариант в Enterprise Edition.

3. @WilliamRobertson, как я могу это проверить?

4. Если ваша система уже использует разделение, то вы, вероятно, в порядке. В противном случае спросите своего администратора базы данных.

Ответ №1:

Ну, подход состоит в том, чтобы использовать delete where предложение:

 delete from t
    where datecol < trunc(sysdate) - interval '7' day;
 

Однако лучший подход, вероятно, состоит в том, чтобы разделить таблицу по неделям (или дням). Затем отбросьте разделы, когда они станут старше. Удаление раздела, как правило, происходит намного быстрее, чем удаление отдельных записей.

Комментарии:

1. Спасибо. Как я могу разделить по неделям?

2. @banana_99 . . . Место для начала находится в документации: docs.oracle.com/en/database/oracle/oracle-database/19/vldbg/.