【发布时间】:2019-12-18 11:25:23
【问题描述】:
我们的数据库中有两个日志表,我们的所有应用程序都将向其中写入日志。我们计划每天创建一个 cron 作业来删除超过 60 天的记录。
两个表都没有任何主键。下面是 DDL 表供您参考。
CREATE TABLE AUDITLOG
(
UUID varchar2(50) NOT NULL,
INTERFACEID varchar2(50) NOT NULL,
APPLICATIONNAME varchar2(50) NOT NULL,
COMPONENTNAME varchar2(50) NOT NULL,
SOURCEAPPLICATIONNAME varchar2(50) NOT NULL,
TARGETAPPLICATIONNAME varchar2(50) NOT NULL,
MESSAGE varchar2(400) NOT NULL,
ENGINENAME varchar2(50) NOT NULL,
TRANSACTIONTIMESTAMP timestamp,
TIMESTAMP timestamp,
EXCEPTION CLOB,
LOGTYPE varchar2(20) NOT NULL
);
CREATE TABLE TRANSACTIONLOG
(
UUID varchar2(50) NOT NULL,
INTERFACEID varchar2(50) NOT NULL,
APPLICATIONNAME varchar2(50) NOT NULL,
TRANSACTIONTIMESTAMP timestamp,
TIMESTAMP timestamp,
EVENTPAYLOAD CLOB,
LOGTYPE varchar2(20) NOT NULL
);
CREATE INDEX AUDITLOG_UUID_IDX ON AUDITLOG(UUID);
CREATE INDEX AUDITLOG_TIMESTAMP_IDX ON AUDITLOG(TIMESTAMP);
CREATE INDEX TRANSACTIONLOG_UUID_IDX ON TRANSACTIONLOG(UUID);
CREATE INDEX TRANSACTIONLOG_TIMESTAMP_IDX ON TRANSACTIONLOG(TIMESTAMP);
不是数据库专家,我这样做的简单方法是
/* Query to purge log tables older than 60 days */
delete from AUDITLOG where timestamp < trunc(sysdate) - 60;
delete from TRANSACTIONLOG Where timestamp < trunc(sysdate) - 60;
由于记录的数量可能以数千计(clob xml 也可能很大),我仍然不确定这是否是最好的方法。我正在考虑的另一种方法是创建一个具有自动序列的主键并尽可能多地删除行。
欢迎提出建议
【问题讨论】:
-
你的方法对我来说似乎没问题。时间戳被索引,语句应该能够使用索引。
-
一帧挑战优先:“是否需要删除日志?”你说“记录的数量可能是数千”;这是少量数据(除非您的
CLOB值特别大),您可以查看保留日志数据的好处是否大于管理单独进程以删除它并永远丢失该信息的麻烦。 -
如果记录的数量是数千,甚至数万,您可能没有任何担心。即使是数百万,您也可以开始从事后台工作并忘记它。但我同意@MT0 的观点,即值得考虑是否真的需要删除这些日志。保留多年的日志记录对于故障排除和诊断很有用
-
我想知道人们是否真的担心优化 delete 查询。
-
更好的解决方案:根据您的 TIMESTAMP 字段对日志表进行分区,然后删除两个多月前的分区。