你delete后,产生了大量碎片,insert慢就正常了
删1/3数据,可以不用delete啊,搞个临时表性能可能会更好

解决方案 »

  1.   

    导入时到全局零时表里边,然后去重复杀入到正式表中。若一次性数据,还可以这样,现将数据复制到一个临时表中,然后对原表进行TRUNCATE  table 操作,然后将数据弄回来。 这样表中的碎片就消失了。
      

  2.   

    如果不是特别忙的环境,并且晚上可以停机1小时左右,可以考虑先CTAS、truncate、insert select 、再收集统计信息。四步手工执行,分开来做,不建议脚本自动化。
      

  3.   

    通过delete删除大量数据后,其实高水位线还是没有下降。于是在insert时,需要在高水位线下,来查找空闲空间来插入数据,这个肯定需要更长的时间。可以收缩表:alter table xxx shrink space不过由于这个操作会锁表,所以最好在维护期间进行操作,而不是在业务高峰期进行操作。
      

  4.   

    在收缩表前,还必须要启动行移动:alter table xxx enable row movement;然后:alter table xxx shrink space;
      

  5.   

    表中记录被删除后,索引中对应的键值不会被删除(即所占用空间不会释放),而只是加上删除标记。如果以后有新的键值(一个或多个)加进这个数据块,则块中标记删除的键值都会清除。
    所以你在删除操作后做一下索引重建,然后再做一下碎片整理,否则以后每次操作都有多余的步骤在执行,比如看rowid是否重复,要删除等等多余的操作。
      

  6.   

    重建索引 alter <index 名字> rebuild;
    手工收集单表统计信息: EXEC DBMS_STATS.gather_table_stats('<table owner>', '<table_name>');