一个表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才能提高实现这个检索的效率?
多谢了!
现在我想把该表中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才能提高实现这个检索的效率?
多谢了!
from MYTBL A
where A.ID2='1'
group by A.ID1, A.ID2, A.NAME1, A.NAME2, A.BIRTHDAY, A.GENDER
having count(*)>1
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,看看瓶颈在什么地方
我再试试nforcedzh(翔天)的方法吧。
问题解决了。
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'
)