`

关于distinct 和group by的去重逻辑浅析

阅读更多

在数据库操作中,我们常常遇到需要将数据去重计数的工作。例如:

表A,列col

A

C

A

B

C

D

A

B

 

结果就是一共出现4个不同的字母A、B、C、D

即结果为4

大体上我们可以选择count(distinct col)的方法和group+count的方法。

分别为:

select count(distinct col) from A;

select count(1) from (select 1 from A group by col) alias;

 

两中方法实现有什么不同呢?

 

其实上述两中方法分别是在运算和存储上的权衡。

distinct需要将col列中的全部内容都存储在一个内存中,可以理解为一个hash结构,key为col的值,最后计算hash结构中有多少个key即可得到结果。

很明显,需要将所有不同的值都存起来。内存消耗可能较大。

 

而group by的方式是先将col排序。而数据库中的group一般使用sort的方法,即数据库会先对col进行排序。而排序的基本理论是,时间复杂为nlogn,空间为1.,然后只要单纯的计数就可以了。优点是空间复杂度小,缺点是要进行一次排序,执行时间会较长。

 

 

两中方法各有优劣,在使用的时候,我们需要根据实际情况进行取舍。

具体情况可参考如下法则

 

数据分布 去重方式 原因
离散 group distinct空间占用较大,在时间复杂度允许的情况下,group 可以发挥空间复杂度优势
集中 distinct distinct空间占用较小,可以发挥时间复杂度优势

 

两个极端:

1.数据列的所有数据都一样,即去重计数的结果为1时,用distinct最佳

2.如果数据列唯一,没有相同数值,用group 最好

 

 

当然,在group by时,某些数据库产品会根据数据列的情况智能地选择是使用排序去重还是hash去重,例如postgresql。当然,我们可以根据实际情况对执行计划进行人工的干预,而这不是这里要讨论的话题了。

 

 

2
0
分享到:
评论
1 楼 指尖残血 2016-03-24  
mark

相关推荐

    Mysql中distinct与group by的去重方面的区别

    在MySQL数据库中,`DISTINCT` 和 `GROUP BY` 是两个非常重要的SQL关键字,它们都可以用来处理数据的去重问题,但在实际应用中,两者的使用场景和效果有所差异。 首先,`DISTINCT` 关键字的主要作用是去除查询结果中...

    django queryset 去重 .distinct()说明

    我就废话不多说了,大家还是直接看代码吧! contacts = ... return house.distinct() 合并出来的queryset,再去重。 补充知识:Python——深入理解urllib、urllib2及requests(requests不建议使用?)

    C# 实现Distinct将对象按条件去重

    平时,我们将c#中的Distinct大多用于对数组去重,一般数组为基础的数据类型,例如 int,string.也可以用于对象去重,我们看看C#对Distinct方法的定义: 有重载,第一个参数都加了this,是拓展方法,有关拓展方法,请...

    MongoDB教程之聚合(count、distinct和group)

    总结来说,MongoDB 的聚合功能是其强大之处,`count`、`distinct` 和 `group` 提供了对数据进行统计、查找唯一值和复杂分组的能力,从而满足了数据分析和报告的各种需求。在实际项目中,这些聚合操作可以帮助开发者...

    用C#实现对DataTable的JOIN,GROUP BY,FILTER,UNIONALL,DISTINCT

    用C#实现对DataTable的JOIN,GROUP BY,FILTER,UNIONALL,DISTINCT

    SQL去重 清除冗余数据

    对于查询结果去重,可以使用distinct关键字标注需要去重的字段,也可以使用group by + 关键字。 使用distinct关键字可以取得不重复的值,例如:Select distinct name from Lin_test将会取得name列的不重复的值。...

    MySQL中distinct与group by语句的一些比较及用法讲解

    在MySQL数据库中,`DISTINCT` 和 `GROUP BY` 是两种用于数据去重和分组统计的SQL语句,它们虽然都可以帮助我们处理重复数据,但有着不同的应用场景和执行机制。 1. `DISTINCT` 关键字: - `DISTINCT` 主要用于去除...

    Distinct自定义去重

    今天遇到一个数组再分组的情况,思路是先找到分组的原则,之后再遍历一次得到分组的数据。 就是把所有重复的数据去掉,(分组依据) 重写了IEqualityComparer接口,并实现了它,但是有一点当明没有搞明白。...

    使用Distinct查询.rar

    `DISTINCT`通常与`GROUP BY`和聚合函数(如`COUNT`, `SUM`, `AVG`, `MIN`, `MAX`)一起使用,用于计算每个分组的唯一值。例如,计算每个部门的员工数量: ```sql SELECT DISTINCT department, COUNT(*) AS employee...

    完美解决distinct中使用多个字段的方法

    完美解决distinct中使用多个字段的方法,完美解决distinct中使用多个字段的方法完美解决distinct中使用多个字段的方法完美解决distinct中使用多个字段的方法完美解决distinct中使用多个字段的方法

    MySQL中Distinct和Group By语句的基本使用教程

    在MySQL数据库中,`DISTINCT`和`GROUP BY`是两个非常重要的查询语句,它们在处理数据去重和分组方面发挥着关键作用。本文将详细介绍这两个语句的使用方法。 首先,`DISTINCT`关键字是用来去除查询结果中重复记录的...

    MySQL中distinct与group by之间的性能进行比较

    在MySQL数据库中,`DISTINCT` 和 `GROUP BY` 是两个用于数据去重的语句,但它们在功能和性能上有显著的区别。这次的测试主要比较了这两种方法在不同条件下的执行效率,尤其是在数据量较大的情况下。 首先,`...

    EFCore查询不重复数据Distinct.docx

    此外,如果你的数据库支持窗口函数(如SQL Server的`ROW_NUMBER()`),你可以考虑使用它们与`PARTITION BY`一起,以在数据库层面同时实现去重和排序,这样通常能提供更好的性能。 总之,使用EFCore查询不重复数据并...

    利用Distinct()内置方法对List集合的去重问题详解

    说到对集合去重处理,第一时间想到的肯定是Linq的Distinct扩展方式,对于一般的值类型集合去重,很好处理,直接list.Distinct()即可。但是如果想要对一个引用类型的集合去重(属性值都相同就认为重复),就会发现,...

    mysql中去重 distinct用法

    在MySQL数据库中,`DISTINCT` 是一个非常重要的SQL关键字,用于从查询结果中去除重复的行。在处理数据时,我们经常会遇到需要提取唯一值...根据实际需求,结合`GROUP BY`和聚合函数,可以实现更复杂的去重和统计操作。

Global site tag (gtag.js) - Google Analytics