如何限制表中的记录数,以便删除旧记录,但保留新行?

时间:2019-07-10 18:23:20

标签: sql oracle plsql database-trigger

我的oracle数据库中有一个表,该表根据Web应用程序中的用户会话跟踪下载。在过去的几年中,此表已增长到数百万条记录,这使应用程序运行缓慢。

我想将此表限制为仅保留上周的项目,并使其自动删除较旧的记录。该表具有一个名为DOWNLOAD_DATE的日期字段,可用于该查询。

我可以使用触发器吗?如果是这样,最好的方法是什么?

3 个答案:

答案 0 :(得分:2)

我认为触发器不是正确的选择,因为触发器在每个插入/更新/删除操作中都执行。我建议为执行该语句的过程创建一个过程,例如“从table_name中删除,其中trunc(download_date)

然后,根据您的需要将程序安排为每小时或每天执行一次。

删除后,您可能希望使用“ DBMS_STATS.GATHER_TABLE_STATS('schema_name','table_name');”刷新表统计信息

有关收集统计信息的更多信息,请参见:http://www.dba-oracle.com/t_dbms_stats_gather_table_stats.htm

答案 1 :(得分:0)

  

我可以使用触发器吗?如果是这样,最好的方法是什么   这样做吗?

好吧,我想说Statement level触发器非常适合这个问题。了解有关语句级触发器Here

的信息

请参阅演示

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

答案 2 :(得分:0)

如果我有这样的要求,我会这样:

步骤p1 是 开始    环       从table123删除---您可以在此处输入表名             在哪里download_date <= SYSDATE-7 AND ROWNUM <= 10000; ---如果您想限制一次删除行

  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天以上的记录