`
lzth
  • 浏览: 138473 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于百万级记录的SQL语句优化,需要取出所有重复的数据

阅读更多
需要从表A中取得所有字段b相同的数据
如下,该SQL用于查询出数据库中某表的所有重复记录!

比如表A
——————————————————————
ID USER     PASS
——————————————————————
1 test1        a
2 test2        b
3 test3        c
4 test3        cc
5 test3        ccc
6 test4      d
7 test5      d
8 test5      e
——————————————————————

用什么方法找出其中USER重复的数据,即
3 test3 c
4 test3 cc
5 test3 ccc
7 test5 d
8 test5 e

这只是一个例子,如果表中的数据有几百万条,如何提高查询的效率

SQL语句写了很多种了,但速度都很慢。
例如如下SQL,在表中数据量很少时执行速度还是很快的,但是当数据量打到50W时,我至今没有等到它的返回结果....
select id,user,pass
from A
where user in (
          select user
          from A
          group by user having count(user)>1);

再ORACLE的环境下
可以考虑用EXISTS条件语句代替IN语句

Sql代码
1.SELECT A1.ID, A1.USER, A1.PASS   
2.FROM A A1  
3.WHERE EXISTS  
4.(  
5.    SELECT 1   
6.    FROM A A2  
7.    WHERE A1.USER = A2.USER 
8.    AND A1.ID <> A2.ID  
9.) 
SELECT A1.ID, A1.USER, A1.PASS
FROM A A1
WHERE EXISTS
(
    SELECT 1
    FROM A A2
    WHERE A1.USER = A2.USER
    AND A1.ID <> A2.ID
)



如果是BATCH或者SP,可以考虑作一个如下的中间表B

Sql代码
1.CREATE TABLE B  
2.AS   
3.SELECT   
4.    USER, COUNT(*) AS USER_COUNT  
5.FROM A  
6.GROUP BY USER   
7.HAVING COUNT(*) > 1  
8./  
9.ALTER TABLE B  
10.  ADD PRIMARY KEY (USER)  
11./ 
CREATE TABLE B
AS
SELECT
    USER, COUNT(*) AS USER_COUNT
FROM A
GROUP BY USER
HAVING COUNT(*) > 1
/
ALTER TABLE B
  ADD PRIMARY KEY (USER)
/


然后用以下SQL进行检索

Sql代码
1.SELECT A.*  
2.FROM A  
3.INNER JOIN B ON 
4.A.USER = B.USER 


这条执行的效率怎样?

Sql代码
1.select user   
2.          from A   
3.          group by user having count(user)>1 
select user
          from A
          group by user having count(user)>1

还有重复的几率有多大,如果超过一半的话,优化死也优化不到哪里去

可以用left join试试(mysql测试通过)

Sql代码
1.select a.id,a.user,a.pass   
2.from 
3.        (select user   
4.            from A   
5.            group by user having count(user)>1  
6.        ) AS B left join A on B.user=A.user 


分享到:
评论

相关推荐

    SQL性能优化

     SQL在运行时先取出数个查询的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。  实际大部分应用中是不会产生重复的记录,推荐采用UNION ALL操作符...

    最全的oracle常用命令大全.txt

    如果我们想查询跟索引有关的数据字典时,可以用下面这条SQL语句: SQL&gt;select * from dictionary where instr(comments,'index')&gt;0; 如果我们想知道user_indexes表各字段名称的详细含义,可以用下面这条SQL语句:...

    【分布式事务----LCN】LCN原理及使用方式.docx

    - 该模式由于每次执行SQL之前需要先查询影响数据,因此相比LCN模式消耗资源与时间要多。 - 该模式不会占用数据库的连接资源。 二、原理 核心步骤 1.创建事务组 是指在事务发起方开始执行业务代码之前先调用...

    Java面试宝典2010版

    6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 7、写一个Singleton出来。 8、递归算法题1 9、递归算法题2 10、排序都有哪几种方法?请列举。用JAVA实现一个...

    易语言程序免安装版下载

    以前编译好的模块(.ec)甚至不需要重新编译即可直接支持静态编译。  支持库开发框架调整是扩展性调整,比较好的做到了向前向后兼容。即,新版支持库可被旧版易语言或易程序使用,旧版支持库也可被新版易语言或易程序...

    JAVA上百实例源码以及开源项目源代码

     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    JAVA上百实例源码以及开源项目

     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    最新Java面试宝典pdf版

    6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归算法题2 78 10、排序都有哪几种方法?请列举。用JAVA...

    Java面试笔试资料大全

    6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归算法题2 78 10、排序都有哪几种方法?请列举。用JAVA...

    Java面试宝典-经典

    6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归算法题2 78 10、排序都有哪几种方法?请列举。用JAVA...

    JAVA面试宝典2010

    6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归算法题2 78 10、排序都有哪几种方法?请列举。用JAVA...

    java面试题大全(2012版)

    6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归算法题2 78 10、排序都有哪几种方法?请列举。用JAVA...

    Java面试宝典2012版

    6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 71 7、写一个Singleton出来。 75 8、递归算法题1 77 9、递归算法题2 78 10、排序都有哪几种方法?请列举。用...

    java面试宝典2012

    6、从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序: 78 7、写一个Singleton出来。 81 8、递归算法题1 84 9、递归算法题2 85 10、排序都有哪几种方法?请列举。用JAVA...

Global site tag (gtag.js) - Google Analytics