Как ограничить количество записей в таблице, чтобы старые записи удалялись, а новые строки сохранялись? - PullRequest
0 голосов
/ 10 июля 2019

В нашей базе данных oracle есть таблица, которая отслеживает загрузки на основе сеанса пользователей в веб-приложении. За последние несколько лет эта таблица выросла до миллионов записей, что замедляет работу приложения.

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

Это то, что я могу сделать с триггерами? Если да, то как лучше это сделать?

Ответы [ 3 ]

2 голосов
/ 10 июля 2019

Я не думаю, что триггер подходит для этого, так как он выполняется при каждой вставке / обновлении / удалении.Я бы порекомендовал создать процедуру для той, которая выполняет оператор, такой как «delete from table_name where trunc (download_date)

Затем вы планируете выполнение этой процедуры каждый час или деньосновываясь на ваших потребностях.

После удаления вы можете обновить статистику таблицы с помощью "DBMS_STATS.GATHER_TABLE_STATS ('имя_схемы', 'имя_таблицы');"

Подробнее о сборе статистики можно найти здесь: http://www.dba -oracle.com / t_dbms_stats_gather_table_stats.htm

0 голосов
/ 11 июля 2019

Если бы у меня было такое требование, я бы поступил так:

ПРОЦЕДУРА p1 НАЧИНАЕТСЯ УДАЛИТЬ ЦИКЛ ПЕТЛИ ИЗ table123 --- вы можете указать здесь имя таблицы WHERE download_date <= SYSDATE - 7 AND ROWNUM <= 10000;--- если вы хотите ограничить удаление строк одновременно </p>

  EXIT WHEN SQL%ROWCOUNT = 0;

  COMMIT;

  DBMS_LOCK.sleep (10); ----- if you want to give sleep time as per your requirement

END LOOP;END;

это задание будет выполнено в течение 24 * 7 и удалит все записи старше 7 дней

0 голосов
/ 11 июля 2019

Это то, что я могу сделать с триггерами?Если да, то каков наилучший способ сделать это?

Ну, я бы сказал, триггер Statement level хорошо подходит для этой проблемы.Читайте о триггере уровня оператора Здесь

См. Демонстрацию:

SQL> CREATE TABLE tab2 (
    col          VARCHAR(1),
    start_date   DATE,
    end_date     DATE
   );
  /
 Table created

SQL> Select * from tab2;
COL START_DATE  END_DATE
--- ----------- -----------
A   11-07-2019  18-07-2019
A   11-07-2019  31-07-2019
A   06-07-2019  31-07-2019
A   01-07-2019  31-07-2019  --- See this row is 10 days older than Sysdate

-- Created Statement level trigger 
SQL> CREATE OR REPLACE TRIGGER t1
  2  BEFORE  INSERT ON tab2
  3  BEGIN
  4      DELETE FROM tab2
  5      WHERE start_date <= SYSDATE - 7; -- Deleting records older that 7 days from sysdate
  6  END;
  7  /
Trigger created

SQL> Insert into tab2 values('A',sysdate+1,sysdate+10);
1 row inserted

SQL> commit;
Commit complete

-- You can see the records older that 7 days from sysdate is deleted
SQL> Select * from tab2;
COL START_DATE  END_DATE
--- ----------- -----------
A   11-07-2019  18-07-2019
A   11-07-2019  31-07-2019
A   06-07-2019  31-07-2019
A   12-07-2019  21-07-2019
...