zoukankan      html  css  js  c++  java
  • oracle删除大表的数据的方法

          今天在公司中碰到访问表数据(test 表)速度非常慢,简单的一个select 语句花了10多分钟, 后来查询一下表的数据量,一共有278万多条数据,而且这个数据表的数据大都过期了,对于现在的业务没什么用。可悲的是这个表竟然也没做分区,也许是前人设计时欠缺了考虑。因为这个表的访问非常频繁,适成的整个系统卡住的现象,必须马上解决。当然解决的办法就是把没用的过期的数据删除掉,但是表的数据量这么大,直接delete掉过期的数据行肯定要花很多时间,而且也会产生很多不必要的undo,redo信息。

         所以我采用 create table test_temp as select * from test t where t.add_data >= '20100817000000', 这样重新建立一个表test_temp只保存最近一天的数据也就几十条而已,然后重命名原来test表为testold表,表test_temp为test表,,再把相关的存储过程,存储函数重新编译一下,并重新建立索引,做表分析,删除原来testold表。 哇,大功告成,访问速度快了。不过,后来发现这个做法产生了两个问题:

       1. test_temp表直接建立在默认的system表空间,这是非常不好的,所以采用这种方法记得指定表空间,语法如下: create table T tablespace ts as ........(ts为指定的表空间)

       2.原来test表里面的一个约束可能不会移动test_temp表上,比如字段默认值,这个就可能对现在系统DML操作造成影响,所以一定要记住检查一下各个约束,对加上约束。笔者就是出现这个情况,导致部份DML失败。

  • 相关阅读:
    Oracle statspack 安装及使用
    MyEclipse 快捷键
    ORACLE EXP/IMP的使用详解
    PyCharm如何配置断点调试功能
    ftl-server静态资源服务器
    JS计算两个日期时间差,天 小时 分 秒格式
    readystatechange
    js实现input中输入数字,控制每四位加一个空格(银行卡号格式)
    javascript“类”与继承总结和回顾
    Javascript根据指定下标或对象删除数组元素
  • 原文地址:https://www.cnblogs.com/kundij/p/1802019.html
Copyright © 2011-2022 走看看