CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Oracle >  开发

如何提高检索数据表中重复记录的效率?

楼主kadina(次帅)2005-11-15 15:53:50 在 Oracle / 开发 提问

一个表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才能提高实现这个检索的效率?      
  多谢了! 问题点数:100、回复次数:5Top

1 楼zzwind5(★★★★★)回复于 2005-11-15 20:07:07 得分 20

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(*)>1Top

2 楼nforcedzh(翔天)回复于 2005-11-15 21:39:32 得分 80

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,看看瓶颈在什么地方Top

3 楼kadina(次帅)回复于 2005-11-16 08:58:30 得分 0

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

4 楼kadina(次帅)回复于 2005-11-16 10:52:42 得分 0

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

5 楼kadina(次帅)回复于 2005-11-16 11:14:21 得分 0

改成:  
  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'      
  )Top

相关问题

  • 面对有数百万记录的数据表,怎么提供程序效率?
  • 记录在数据表中的位置?
  • 如何检索数据表已经存在了 ̄???
  • 数据表读取效率问题,请谈谈经验
  • 怎样删除数据表中重复的内容?怎样知道数据表中记录数目?
  • 数据表中记录的查找问题
  • 怎样知道数据表中增加了新记录?
  • 用Data1控件怎样取得数据表的记录总数?
  • 有关数据表记录的定位问题
  • 如何在textBox中显示数据表中多项记录?

关键词

  • mytbl
  • gender
  • birthday
  • rowid
  • 表
  • 方法
  • where
  • select

得分解答快速导航

  • 帖主:kadina
  • zzwind5
  • nforcedzh

相关链接

  • Oracle类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo