create table ZY_TRADE_bak as 
    select * from ZY_TRADE where INS_TIME>... ;
truncate table ZY_TRADE;
insert into ZY_TRADE select * from ZY_TRADE_bak;
drop table ZY_TRADE_bak;

解决方案 »

  1.   

    就看你3个月的数据有多少了,如果相对于记录总数1亿5千万条要少得多的话,采用楼上的做法应该是效率比较高的了,不过最好能利用你建立的索引,3个月内的CARD_NO、REACH_TIME应该有个范围值吧,在create table ZY_TRADE_bak 时最好能在where条件中体现,否则那速度.....PS:建议在create table ZY_TRADE_bak 之后,执行commit;操作,否则回滚段有可能不够。
      

  2.   

    3个月的数据大约7000万条,可是如果我用REACH_TIME的话,该字段为复合索引,在WHERE中单独使用可以吗?
    我执行SELECT COUNT(*) FROM ZY_TRADE语句时间很长,现在已经20分钟了,和没有查完,怎么办?
    我执行bobfang(匆匆过客)的语句,一天可以完成吗?
      

  3.   

    TO 空杯:厉害,佩服!是应该COMMIT一下.
    TO estevewu :哥们,哪里的干活?
      

  4.   

    Oracle 8以上好像是可以利用复合索引中的部分字段的,有总比没好。你可以试一下加入REACH_TIME作为条件时执行select count(*) ...之类查询语句的效率。
      

  5.   

    数据已经备份。
    我可否这样做,请高手们指点
    SELECT MIN(ROWID) FROM ZY_TRADE WHERE REACH_TIME<TO_DATE('2002-12-01 00:00:00','YYYY-MM-DD HH24:MI:SS');将MIN(ROWID) TO Acreate table ZY_TRADE_bak as 
        select * from ZY_TRADE where ROWID>A ;truncate table ZY_TRADE;insert into ZY_TRADE select * from ZY_TRADE_bak;drop table ZY_TRADE_bak;ROWID有索引,这样快一些是吗?
    删除的数据并不特别的重要,只要保留2~3个月的即可。
      

  6.   

    主要是不能保证3个月的数据是连续存放的,所以rowid>A的不一定都是你这3个月的数据,到时还得进行清理。
      

  7.   

    create table bak as select * from ZY_TRADE where( 使用时间比较一下)
    commit;
    truncate table ZY_TRADE;
    insert into ZY_TRADE select * from bak;
    drop table bak;使用rowid好像有点别出心裁,使用=来比较倒时见过,可是使用<>来比较,效果怎么样就很难说了
      

  8.   

    这么大的数据量,用上索引估计也没多少效果,
    2CPU,可以考虑并行,
    再建表时,考虑分区,否则以后又要痛苦一回。
      

  9.   

    可否这样考虑
    create table zy_trade_bak as select * from ZY_TRADE where( 使用时间比较一下);
    commit;
    rename table zy_trade to zy_trade_old;
    rename table zy_trade_bak to zy_trade;
    drop table zy_trade_old;