各位.前天求教了一条关于如何删除重复数据的SQL,在Oracle 9i里.
可参见: http://topic.csdn.net/u/20071030/10/6ddba217-dfad-44c7-97ee-7959f8bd34fd.html根据大家的提议,采用rowid是可以解决,但是该表有大量数据(几十万条).采用rowid很慢,而且还导致数据库服务器CPU 100%,
所以想请教除了采用rowid,还有其他可行的办法吗?多谢!

解决方案 »

  1.   

    要不建一个和原表结构一样的视图v_table1,视图里存table没有重复的数据(create or replace v_table as select distinct id,nanem from table),然后删除表talbe的数据(truncate table table),再把视图的数据重新插入到表中
    可以不?
      

  2.   

    to sanmmu:
    这个方法我是试过,但是只要是含有rowid的Delete 语句,就会非常慢.Select语句包含rowid没有影响.thanks
      

  3.   

    我的思路并没有让你用delete阿
    大家讨论下哈
      

  4.   

    改进sanmmu的一下.
    视图恐怕是不行的.除非定义了物化视图.复杂了些,
    就用基于session的零时表. 其它的同sanmmu所说的.
    也只能试验试验一下.没有干过在那么大的表格上删除重复数据.
    如效率无显著的改进,不如用原来那贴的最后一个答复.
      

  5.   

    你是用哪个SQL来删除的?有没有查过那个SQL的执行计划?表是否做过分析?
    我测试过在100多万的记录的表中(表大约占用了370M磁盘空间),重复记录在100来条,执行
    delete  from t a
     where a.rowid not in (select max(rowid) 
                        from t b group by id);
    只需要45秒。
      

  6.   

    用rowid很慢那就没办法了,都知道rowid是直接指向物理地址的,别的条件或者索引都是根据条件找到rowid再进行操作的,有可能不是语句的问题了,从别的方面想想出路看