一个表MYTBL,有以下几列:ID1、ID2、NAME1、NAME2、BIRTHDAY、GENDER,其中ID1、ID2是主键。已建立(ID2、NAME1、NAME2、BIRTHDAY、GENDER)的复合索引。  
现在我想把该表中ID2='1'的NAME1、NAME2、BIRTHDAY、GENDER重复的记录全部检索出来,使用如下SQL:  
 
SELECT DISTINCT A.ID1, A.ID2, A.NAME1, A.NAME2, A.BIRTHDAY, A.GENDER  
FROM MYTBL A, MYTBL B    
WHERE A.ROWID<>B.ROWID    
AND A.NAME1=B.NAME1    
AND A.NAME2=B.NAME2    
AND A.BIRTHDAY=B.BIRTHDAY    
AND A.GENDER=B.GENDER    
AND A.ID2=B.ID2    
AND B.ID2='1'  
 
表中数据量大约为50万件,现在执行一遍大约需要2个多小时。  
 
请问怎样修改SQL才能提高实现这个检索的效率?  
多谢了!

解决方案 »

  1.   

    select A.ID1, A.ID2, A.NAME1, A.NAME2, A.BIRTHDAY, A.GENDER 
    from  MYTBL A
    where A.ID2='1'
    group by A.ID1, A.ID2, A.NAME1, A.NAME2, A.BIRTHDAY, A.GENDER 
    having count(*)>1
      

  2.   

    SELECT A.ID1, A.ID2, A.NAME1, A.NAME2, A.BIRTHDAY, A.GENDER
      FROM MYTBL A
     WHERE A.ROWID > (SELECT MIN(B.ROWID)
                        FROM MYTBL B
                       WHERE A.NAME1 = B.NAME1
                         AND A.NAME2 = B.NAME2
                         AND A.BIRTHDAY = B.BIRTHDAY
                         AND A.GENDER = B.GENDER)
       AND A.ID2 = '1'
    只是提供一种思路,具体你看看你写的语句的explain_plan,看看瓶颈在什么地方
      

  3.   

    zzwind5的方法我试过,最开始我用的就是这种方法,比我现在用的慢。
    我再试试nforcedzh(翔天)的方法吧。
      

  4.   

    多谢nforcedzh(翔天)的思路提示。
    问题解决了。
      

  5.   

    改成:
    SELECT A.ID1, A.ID2, A.NAME1, A.NAME2, A.BIRTHDAY, A.GENDER
    FROM MYTBL A
    WHERE A.ROWID IN 
    (
    SELECT DISTINCT A.ROWID
    FROM MYTBL A, MYTBL B    
    WHERE A.ROWID<>B.ROWID    
    AND B.NAME1=A.NAME1    
    AND B.NAME2=A.NAME2    
    AND B.BIRTHDAY=A.BIRTHDAY    
    AND B.GENDER=A.GENDER    
    AND B.ID2=A.ID2    
    AND A.ID2='1'  
    )