`
lzth
  • 浏览: 142302 次
  • 性别: 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语句优化是数据库管理中的关键环节,它直接影响到系统的性能和响应时间。以下是一些常见的SQL语句优化技巧: 1. **使用参数化查询**:使用预编译的SQL语句,如示例中的`"select * from people p where p.id = ?...

    SQL性能优化

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

    SQL语句大全

    ### SQL语句大全知识点解析 #### 一、基础部分 **1. 创建数据库** - **语法**: `CREATE DATABASE database-name;` - **说明**: 如果在创建数据库之前想要判断该数据库是否已经存在,可以使用以下语句: ```sql IF...

    SQL数据库语句大全.docx

    **选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)** - **示例**: `SELECT * FROM (SELECT *, RANK() OVER (PARTITION BY b...

    PL_SQL用户指南与参考.doc

    PL/SQL与SQL紧密集成,可以直接在PL/SQL代码中使用SQL语句,使得数据操作更加便捷高效。 **2、面向对象的支持** 虽然PL/SQL本身不是一种完全的面向对象语言,但它通过包、游标等机制支持了一些面向对象的特性,如...

    区域横向重复-asp

    2. **执行查询**:编写SQL语句获取所需数据,比如获取某表的所有记录。例如: ```vbscript Dim rs Set rs = Server.CreateObject("ADODB.Recordset") sql = "SELECT * FROM 表名" rs.Open sql, conn ``` 3. **处理...

    PHP实现在数据库百万条数据中随机获取20条记录的方法

    代码示例中展示了一个简化的查询语句,其中使用了`mt_rand`函数来生成随机偏移量,并通过SQL查询从表中取出一条记录。实际上,为了确保取出的20条记录是随机且不重复的,需要在随机偏移量生成后对之前抽取的记录进行...

    对象保存进MySQL数据库,从MySQL中读取出对象信息(源码)

    10. **性能优化**:在大量数据操作时,考虑使用批处理(batch processing)和预编译的SQL语句来提升性能。此外,合理设计数据库表结构,如使用合适的数据类型,创建索引,也能提高查询效率。 以上就是关于“对象...

    SQL命令详解B

    `SELECT`是最基本的SQL语句之一,用于从数据库表中检索数据。其基本语法是`SELECT "栏位名" FROM "表格名"`,其中“栏位名”是你想要检索的具体列,“表格名”则是数据所在的表。例如,`SELECT store_name FROM ...

    MySQL查询性能优化

    不断地重复执行相同的查询,然后每次都返回相同的数据(比如商城主页,比如重复查询用户的头像 URL),那么这种情况,我们可以把这种热点数据缓存起来,需要的时候从缓存中取出,这样性能显然会更好。 三、MySQL ...

    SQL Server索引基础知识.pdf

    磁盘I/O操作在页级别进行,即SQL Server每次读取或写入数据的最小单位是一个数据页。值得注意的是,日志文件不采用这种方式存储,而是存储为一系列的日志记录。 - **数据页**: 数据库中的每个页面大小固定为8KB,...

    阿里巴巴笔试题及答案.docx

    例如,要从表`t(a,b,c,d)`中根据字段`c`排序后取出第21至30条记录,可以使用以下SQL语句实现: ```sql CREATE TABLE T(A NUMBER(8), B NUMBER(8), C NUMBER(8), D NUMBER(8)); BEGIN FOR I IN 1 .. 300 LOOP ...

    常见面试问答题.docx

    本文总结了数据库面试中常见的问题和答案,涵盖了数据库基本概念、SQL语句、索引、分区、数据处理等方面。 一、数据库基本概念 * 主键(Primary Key):要求唯一的并且非空,用于标识表中的每一行记录。 * 外键...

    asp.net面试题

    具体SQL语句会较为复杂,这里不展开。 以上是针对ASP.NET面试中常见SQL题目的解答,涵盖了数据查询、排序、分组、去重、聚合以及约束设置等多个方面。这些知识点在实际开发中非常关键,对数据库性能优化和数据处理...

    asp.net通用分页类

    2. **数据查询**:根据分页参数动态构建SQL查询语句,如`SELECT * FROM TableName LIMIT (CurrentPage - 1) * PageSize, PageSize`。在ASP.NET中,可以使用ADO.NET的SqlCommand对象或Entity Framework的LINQ方法实现...

    数据库+Mysql+性能调用+用于在实践过程中进行Mysql的性能调优

    9. **预编译SQL语句**:使用预处理语句( Prepared Statements),减少解析和优化过程,提高重复执行的效率。 10. **避免在WHERE子句中使用否定条件**:否定条件可能导致无法使用索引,应尽可能转换为正向表达式。 ...

Global site tag (gtag.js) - Google Analytics