Chinaunix首页 | 论坛 | 博客
  • 博客访问: 390060
  • 博文数量: 58
  • 博客积分: 2096
  • 博客等级: 大尉
  • 技术积分: 608
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-29 16:09
个人简介

专注于数据库技术研究和实践,目前就职于互联网金融企业,提供Oracle数据库技术支持和维护。 联系电话:18616803656

文章分类

全部博文(58)

文章存档

2020年(1)

2019年(4)

2018年(1)

2017年(3)

2015年(4)

2014年(7)

2012年(1)

2011年(27)

2010年(8)

2009年(2)

我的朋友

分类: Oracle

2017-11-02 16:56:35

背景:
每一个应用系统都有日志表,基本上也都有定期删除日志的需求,这里记录一种可配置日志删除实践,每月初执行。
原来的方式是创建中间表保留需要的数据,再TRUNCATE TABLE,然后INSERT回来,非常耗费时间和资源。改成新的方法以后,Job运行时间从8小时降到1小时。

使用CONNECT BY获取日期列表,这是一个很棒的方法:
SELECT TO_CHAR(DATE'2017-01-01' + (ROWNUM - 1),'YYYY-MM-DD') DT 
FROM DUAL
CONNECT BY ROWNUM <= (TRUNC((SYSDATE - 183),'MONTH') - DATE'2017-01-01');

获取日志表里过滤条件列的最小值,替换DATE'2017-01-01'就可以获得对应表的日期列表,按日期删除数据既快又不会对UNDO造成太大压力。

配置表:LOG_PURGE_CONFIG
TABLE_TYPE VARCHAR2(40) 表类型
TABLE_NAME VARCHAR2(40) 表名
TIME_COLUMN VARCHAR2(40) 过滤条件列
RETENTION_DAYS NUMBER 保留时间
ENABLED CHAR(1) 启用状态
LAST_UPDATE_DATE DATE
CREATE_DATE DATE

e.g.
LOGS VALIDATION_LOG LOG_TIME 183 Y 15-Sep-17 15-Sep-17

需要清理过期日志的可以向上面这样配置,以后添加日志表或者修改保留时间就不需要改动Procedure了。

附上Package文件:
PKG_PURGE_EXPIRED_DATA.sql



阅读(1039) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~