我的oracle数据库中有一个表,该表根据Web应用程序中的用户会话跟踪下载。在过去的几年中,此表已增长到数百万条记录,这使应用程序运行缓慢。
我想将此表限制为仅保留上周的项目,并使其自动删除较旧的记录。该表具有一个名为DOWNLOAD_DATE的日期字段,可用于该查询。
我可以使用触发器吗?如果是这样,最好的方法是什么?
答案 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天以上的记录