你这个SQL语句中,我发现影响效率的几处是:
1. ‘!=’运算符;
2. MAX()函数;
3. SELECT子句中条件太多。

解决方案 »

  1.   

    如果是为了除重复记录,oracle在经意的时候已经为我们提供了这个功能。
    难道大家都忘了union了吗?你可以这样,那你的8万记录分成两个表,作union后就是没有重复的记录了。
    我觉得要比上面的要快的多。
      

  2.   

    而且我感觉你的SELECT子句有问题。
      

  3.   

    建议不要用这种方法删除,用
    create table yourbak as select * from yourtable where 不重复的条件;
    重新建立一个表,然后再把不重复的纪录替换你原来的表
    ================================================================
    ★★ chen_cyh(を愛た) ●  
      

  4.   

    如果你的表中只有这些字段,那么可以生成这么一张表
    create table bak as select STARTTIME,OMCID ,MMID,SUBJ_ID_1,SUBJ_ID_2, SUBJ_ID_3,SUBJ_ID_4
                    ,SUBJ_ID_5 from T_U_PMC10  group by 
    STARTTIME,OMCID ,MMID,SUBJ_ID_1,SUBJ_ID_2, SUBJ_ID_3,SUBJ_ID_4
                    ,SUBJ_ID_5
    速度很快
    ================================================================
    ★★ chen_cyh(を愛た) ●  
      

  5.   

    对于数据库来说,delete的效率要比insert 的效率低得多
    insert 是对表操作最快效率的语句之一,
    ================================================================
    ★★ chen_cyh(を愛た) ●  
      

  6.   

    可以先把索引去掉
    在DELETE
      

  7.   

    利用左连接或右连接可能好一点:
    如你的SQL语句修改为:
    DELETE FROM T_U_PMC10 A 
    WHERE A.ROWID!=(SELECT MAX(ROWID) FROM T_U_PMC10 B
                    WHERE A.STARTTIME=B.STARTTIME (+)
                    AND A.OMCID=B.OMCID(+) AND A.MMID=B.MMID(+)
                    AND A.SUBJ_ID_1=B.SUBJ_ID_1(+) 
                    AND A.SUBJ_ID_2=B.SUBJ_ID_2(+) 
                    AND A.SUBJ_ID_3=B.SUBJ_ID_3(+) 
                    AND A.SUBJ_ID_4=B.SUBJ_ID_4(+) 
                    AND A.SUBJ_ID_5=B.SUBJ_ID_5)(+);一般效率都可以提高几十个级!
    祝你好运。
      

  8.   

    下面两种方法,那种比较快1。该表上不建主键,先插入数据,再删除重复数据;
       此时插入数据时,可以用insert into ... select * from ..
    2。在该表上建立主键,用游标一条条插入
       此时处理异常:
          WHEN DUP_VAL_ON_INDEX THEN
                 NULL;
      

  9.   

    用外连接速度也是奇慢无比。
    我觉得速度慢是因为子查询中的where子句对表中的每一条记录都执行一次,所以很慢,这才8万条,我还有上百万条的表呢:(
      

  10.   

    用外连接速度也是奇慢无比。
    我觉得速度慢是因为子查询中的where子句对表中的每一条记录都执行一次,所以很慢,这才8万条,我还有上百万条的表呢:(
      

  11.   

    你写的删除重复的DELETE语句是最经典的写法,效率低应该是在查询条件中没有用到索引,尝试去除其他的索引,建立对STARTTIME、OMCID、MMID、SUBJ_ID_1、SUBJ_ID_2、SUBJ_ID_3、SUBJ_ID_4、SUBJ_ID_5这几个字段的索引。你说的两种方法我觉得都不怎么好,要是我来做的话,直接用下面两段话进行插入和更新:
    update mytable   --先更新在表中已存在的纪录
       set .... 
     where exists (select 'x' from mytable
                    where ....);insert into mytable (....)  --添加在表中不存在的纪录
    select ... from temp_table
    where not exists (select 'x' from mytable 
                       where ...);
      

  12.   

    你写的删除重复的DELETE语句是最经典的写法,效率低应该是在查询条件中没有用到索引,尝试去除其他的索引,建立对STARTTIME、OMCID、MMID、SUBJ_ID_1、SUBJ_ID_2、SUBJ_ID_3、SUBJ_ID_4、SUBJ_ID_5这几个字段的索引。你说的两种方法我觉得都不怎么好,要是我来做的话,直接用下面两段话进行插入和更新:
    update mytable   --先更新在表中已存在的纪录
       set .... 
     where exists (select 'x' from mytable
                    where ....);insert into mytable (....)  --添加在表中不存在的纪录
    select ... from temp_table
    where not exists (select 'x' from mytable 
                       where ...);
      

  13.   

    你写的删除重复的DELETE语句是最经典的写法,效率低应该是在查询条件中没有用到索引,尝试去除其他的索引,建立对STARTTIME、OMCID、MMID、SUBJ_ID_1、SUBJ_ID_2、SUBJ_ID_3、SUBJ_ID_4、SUBJ_ID_5这几个字段的索引。你说的两种方法我觉得都不怎么好,要是我来做的话,直接用下面两段话进行插入和更新:
    update mytable   --先更新在表中已存在的纪录
       set .... 
     where exists (select 'x' from mytable
                    where ....);insert into mytable (....)  --添加在表中不存在的纪录
    select ... from temp_table
    where not exists (select 'x' from mytable 
                       where ...);
      

  14.   

    弱水大哥:insert into mytable (....)  --添加在表中不存在的纪录
    select ... from temp_table
    where not exists (select 'x' from mytable 
                       where ...);会比我说的第一种(既先插入,后删除重复)方法要快很多吗?
      

  15.   

    索引对insert/delete性能带来的负面影响通常小于对查询带来的性能提升。我最近在翻译的一本关于性能的书中讲到了这一点,并有一些具体的例子。
    不过我无法从text文档中copy中文到ie里,否则可以贴一点出来