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

Sql 如何限制表中记录的数量,以便删除旧记录,但保留新行?,sql,oracle,plsql,database-trigger,Sql,Oracle,Plsql,Database Trigger,我在oracle数据库中有一个表,它根据web应用程序中的用户会话跟踪下载。在过去几年中,此表已增长到数百万条记录,这使应用程序的速度减慢 我想将此表限制为仅保留过去一周的项目,并让它自动删除旧记录。该表有一个名为DOWNLOAD_date的日期字段,可用于此查询 这是我可以用触发器做的吗?如果是这样,最好的方法是什么?我不认为触发器是正确的,因为它在每次插入/更新/删除时都会执行。我建议为执行类似delete from table_name的语句的过程创建一个过程,其中truncdownloa

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

我想将此表限制为仅保留过去一周的项目,并让它自动删除旧记录。该表有一个名为DOWNLOAD_date的日期字段,可用于此查询


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

我不认为触发器是正确的,因为它在每次插入/更新/删除时都会执行。我建议为执行类似delete from table_name的语句的过程创建一个过程,其中truncdownload_date 然后根据您的需要,安排每小时或每一天执行该过程

删除后,您可能希望使用DBMS_stats.GATHER_table_stats“schema_name”、“table_name”刷新表stats

有关收集统计数据的更多信息,请参见:

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

我想说,语句级触发器非常适合这个问题。了解语句级触发器

请参见演示:

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

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

程序p1 是 开始 环 从表123中删除-您可以在此处提供表名
在下载日期,您可能可以通过索引或表分区来解决性能问题。这是事实,但分区仅在Enterprise Edition中可用,并且仅作为付费选项。很明显,您是在业务环境中使用它的。我建议你为你需要的功能付费。答案是分区。看一看。每天/每小时/以任何方式运行作业以删除行/删除分区。
  EXIT WHEN SQL%ROWCOUNT = 0;

  COMMIT;

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