oracle巨大表的数据删除的方法,20分钟搞定
oracle巨大表的数据删除的方法,20分钟搞定
一个客户的日志表,已经有3000多千万的记录了,容量大约30G,打算维护一下,看了一下字段,发现日志是按日期记录的,打算只保留3个月的日志就好了。
第一个思路:
按条件查出来,直接DELETE
试了一下
delete from NTLS_LOGS where to_char(START_TIMES,'yyyy-mm-dd hh:mi:ss') <'2008-08-01 00:00:00';
时间会非常长,不知道多少天能跑完,反正一个晚上没跑完,UNDO会增长到一个可怕的数字
这个思路是不行的
研究了一下,发现大多数人的思路是做个循环,每5000条左右提交一次,做了个测试语句试了一下,每小时能删除80-90万条,晕倒需要删除的数据是2700万条,猴年马月才能完成。
询问客户,发现这个业务日志表不是什么时候都要写的,每天晚上10点到第二天早上6点是没有人会使用的,很好,我立刻考虑了一种方法,思路是将需要的数据提取出来到一个新的表,然后将原表删除,将这个提取出来的表重命名为旧的日志表名。
呵呵,试一下这种方法的威力,生成新的数据整个过程只用了172S,也就是3分钟左右,表是生成了,但是没有索引,那就照抄原表的索引吧,呵呵最后花了18分21秒搞定了,其实原理就是只处理必须保留的数据这些数据远远小于要删掉的数据,跳过不需要的数据,采用CREAT SELECT AS可以充分使用索引,而且不会生存UNDO,因此速度大大加快,该方法的弊端是,必须要有一点时间,没有人使用这个表才行。
于是我写了一个SQL,将这个放到每月的自动执行计划里定期执行,定期维护这个表,避免表异常膨大,说了原理,就该上SQL了。
drop table new_log_temp;
create table new_log_temp as select * from NTLS_log where timestamp > to_date(to_char(SYSDATE-90,'yyyy-mm-dd'),'yyyy-mm-dd');
drop NTLS_LOG;
alter table new_log_temp rename to NTLS_LOG;
create index IDX_NTLS_LOG on NTLS_LOG (RECORD)
tablespace INDEXES
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
create index IDX_NTLS_LOG_OPERATE_ID on NTLS_LOG (OPERATE)
tablespace INDEXES
pctfree 10
initrans 2
maxtrans 255
storage
(
相关文档:
oracle表空间操作详解
1
2
3作者: 来源: 更新日期:2006-01-04
5
6
7建立表空间
8
9CREATE TABLESPACE data01
10DATAFILE '/ora ......
平时用的比较多的,就是NVL,没怎么在意其他几个。
NVL 就不用说了,就是判断第一个是否为NULL,是就用第二个代替,不是就返回第一个。
NVL2 也是判断第一个是否为NULL,但是返回值却不同。第一个为NULL,就返回第三个,否则返回第二个。
NULLIF 判断两个参数是否相等,相等返回NULL,否则返回第一个参数。
COALESCE 这 ......
我的ORACLE RAC INSTALL for LINUX 10.2研究
我的ORACLE RAC INSTALL for LINUX 10.2研究
1、创建虚拟机
DB1虚拟机文件目录 g:\vmtest1 文件大小8G 内存944M(原谅我只有2GRAM)
DB2虚拟机文件目录 E:\vmtest2 文件大小8G 内存944M
在DB1上创建共享磁盘,
E:\SHARE 文件大小8G
DB2也创建磁盘, ......
安装好了之后可以通过这个路径找到一个文本文件:
oracle\product\10.2.0\db_1\NETWORK\ADMIN\listener.ora 还一个在同路径下的tnsnames.ora文件,这两个文本中的一些信息要一样的。
你看看我的这两个文本文件的信息:
listener.ora
# listener.ora Network Configuration File:& ......