历史数据的清理方法

来源:srsunbing 责任编辑:栏目编辑 发表时间:2013-07-01 21:00 点击:

1. 首先要制定数据清理的方法和策略,具体内容略。
2. 对现网数据量进行摸底调查,哪些表需要清理并整理出。
3. 具体清理。
3.1.  分区表数据清理:
    先判定该分区表的索引是LOCAL索引还是GLOBAL索引,这涉及到如何对分区表进行数据清理。
先通过如下语句来查看分区表上建立的索引类型:
 select t.table_name,i.index_name,i.table_owner
   from dba_indexes i,dba_tables t
  where i.table_name = t.table_name
     and t.partitioned='yes'
     and i.partitioned='no';

3.1.1 将全局索引修改为本地索引的方法见下:
    首先要删除原有分区表的全局GLOBAL索引,也分为两种情况,一种是索引是主键,一种是索引不是主键。
3.1.1.1 索引为主键的情况,先将原主键及索引删除:
alter table 表名 drop constraint 约束名 cascade;

然后再创建主键及本地索引,注意local和online参数:
  alter table 表名 add constraint 约束名
primary key (列名, 列名2) using index local online
TABLESPACE 表空间
PCTFREE等原有的存储参数
nologging;

3.1.1.2 另一种索引不为主键的情况,先将索引删除:
dorp index 索引名;

然后再用下面语句为该分区表创建本地索引:
    create index 索引名 on 表名.列名 local online
TABLESPACE 表空间
PCTFREE等原有的存储参数
nologging;

3.1.2 确认所有的分区表上的索引均为本地索引后,按如下方法进行分区数据的清理,并恢复分区的最高水位值到初始点:
alter table 表名 truncate partition 分区名;

3.2. 非分区表的数据清理:
有3种清理数据的方法:
3.2.1 使用循环delete的方法对表数据进行删除。
例:
declare
begin
    loop
      delete from 表名
       where 日期字段 < sysdate-180   --或流水号字段,时间根据实际情况调整
         and rownum<5000;    --每次删5000条
      exit when SQL%ROWCOUNT=0;
    commit;
    end loop;
exception
    when others then
      rollback;
    return;
end;

3.2.2 使用“create …… as select * from…… where……”备份原表,再将原表truncate,
    最后将备份表的数据插回原表insert …… select *,实例省略。

这个方法的主线是:
Rename备份表->新建表(不建索引)->数据插回->重建索引;
或者:
备份表->truncate原表->原表索引约束失效,删除索引->数据插回->原表索引约束激活,重建索引
   
3.2.3 将A表数据exp出为A.dmp文件,再drop掉A表,重建A表后再将A.dmp数据imp回去(一般用于清理高水位表,如果要实现清理数据,则导出dmp时增加query条件过滤旧数据,原理和方法2一样)。
例:
导出数据:
exp userid=域名/密码@SID file= e:\temp\A.dmp log= e:\temp\dmp.log buffer=1046000000 tables=A query=' where 字段名>sysdate-180'
drop原表:   drop table A;
导回原表:
imp userid=域名/密码@SID file= e:\temp\A.dmp ignore=y fromuser=用户名 touser=用户名 log= e:\temp\dmp.log

    对于首次执行清理,如果要清理大量数据,只保留少量数据时用第二种方法,该方法除了可以清理数据外,还能够解决高水位的问题;但是如果清理的数据量不大,或者已经进入持续的自动阶段,则用第一种方法。

操作前说明:
    对于将本地索引重建为分区索引的,还需要注意以下事项:
1、 要有足够的临时表空间,因为重建索引需要对数据进行排序,要占用大量的临时表空间。

--用下面语句来检查索引的数据库空间大小:
select segment_name,segment_type,sum(bytes)
 from dba_segments
where segment_type like 'INDEX%' 
   and segment_name='索引名'
group by segment_name,segment_type;

--用下面语句检查临时表空间大小:
select * from dba_temp_files;

--用下面语句检查当前是否在使用临时表空间:

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • sql常见面试题
      • SQL SERVER 2005性能之跟踪
      • SQL编程(一)
      • LINUX上RMAN自动备份脚本
      • sql server面试题
      • 如何将多个SQL查询统计结果一次显示出来
      • 浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色
      • SQL小技巧系列 --- 行转列合并
      • sql server 列转行
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1