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