[英]How do I limit number of records in table, so that old records are deleted, but new rows are kept?
我的oracle数据库中有一个表,该表根据Web应用程序中的用户会话跟踪下载。 在过去的几年中,此表已增长到数百万条记录,这使应用程序变慢。
我想将此表限制为仅保留上周的项目,并使其自动删除较旧的记录。 该表具有一个名为DOWNLOAD_DATE的日期字段,可用于此查询。
这是我可以使用触发器做的事情吗? 如果是这样,最好的方法是什么?
我认为触发器不是正确的选择,因为触发器在每个插入/更新/删除操作中都执行。 我建议为执行该语句的过程创建一个过程,例如“从table_name中删除,其中trunc(download_date)<trunc(sysdate-7);”。
然后,您可以根据需要安排该程序每小时或每天执行一次。
删除后,您可能需要使用“ DBMS_STATS.GATHER_TABLE_STATS('schema_name','table_name');”刷新表统计信息。
有关收集统计信息的更多信息,请参见: http : //www.dba-oracle.com/t_dbms_stats_gather_table_stats.htm
这是我可以使用触发器做的事情吗? 如果是这样,最好的方法是什么?
好吧,我想说,一个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
如果我有这样的要求,我会这样:
步骤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
结束循环; 结束;
该作业将运行24 * 7,并删除所有7天以上的记录
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.