Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SQL去重是用DISTINCT好,还是GROUP BY好?

SQL去重是用DISTINCT好,还是GROUP BY好?

作者头像
Python数据科学
发布于 2020-12-03 03:40:02
发布于 2020-12-03 03:40:02
3.2K00
代码可运行
举报
文章被收录于专栏:Python数据科学Python数据科学
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
复制

我们知道DISTINCT可以去掉重复数据,GROUP BY在分组后也会去掉重复数据,那这两个关键字在去掉重复数据时的效率,究竟谁会更高一点?

1.使用DISTINCT去掉重复数据

我们先看下面这个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT DISTINCT UnitPrice
FROM [Sales].[SalesOrderDetail]
WHERE UnitPrice>1000;

执行完之后的结果如下:

接下来,我们将这个表里的数据增大到194万条,再重复上面的实验。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--将表SalesOrderDetail插入到一张物理表中

SELECT * INTO Sales.Temp_SalesOrder
FROM [Sales].[SalesOrderDetail] ;

--通过新增的物理表进行自循环插入3次,将数据增加到1941072DECLARE @i INT;
SET @i=0
WHILE @i<4
BEGIN 
--这里没有将SalesOrderDetailID这个自增长的放在列中,是为了让系统自动填充不同的数字进去,保证唯一性。
INSERT INTO Sales.Temp_SalesOrder
(SalesOrderID,CarrierTrackingNumber,OrderQty,ProductID,SpecialOfferID,
UnitPrice,UnitPriceDiscount,LineTotal,rowguid,ModifiedDate)

SELECT 
SalesOrderID,CarrierTrackingNumber,OrderQty,ProductID,SpecialOfferID,
UnitPrice,UnitPriceDiscount,LineTotal,NEWID(),ModifiedDate
FROM Sales.Temp_SalesOrder
 SET @i=@i+1;
END;

SELECT COUNT(1) FROM Sales.Temp_SalesOrder;

(提示:可以左右滑动代码)

将SalesOrderDetailID的自增长属性取消掉之后,插入1000条自身的数据,这样我们就可以得到1000条重复的SalesOrderDetailID,相比1942072条记录占比很小了

如下图,将自增长标识的换成后即可插入了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO sales.Temp_Salesorder
SELECT TOP 1000 * FROM sales.Temp_Salesorder;

数据插入完整后,我们在将上一讲的内容重复一下,看看效果如何?

A.在没建索引的情况下,我们只查询UnitPrice这一列

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT UnitPrice FROM Sales.Temp_SalesOrder ;

我们看一下执行情况:

接下来是鉴证奇迹的时刻了,我们加DISTINCT在UnitPrice前面试试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT  DISTINCT  UnitPrice FROM sales.Temp_Salesorder;

和之前的实验结果一致,在执行时间没有多大差别的情况下,分析时间成倍的减少了。

B.当SalesOrderDetailID取消掉自增长属性后就和普通列一样了。

我们来重复上面的步骤:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT   SalesOrderDetailID FROM sales.Temp_Salesorder

执行完后结果如下:

与上面的UnitPrice没使用DISTINCT情况基本一致。

然后我们给SalesOrderDetailID加上DISTINCT后会怎么样呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT DISTINCT  SalesOrderDetailID
FROM sales.Temp_Salesorder

我们可以看到如下执行情况:

从上图可以看到,DISTINCT已经排除了1000条记录,但是在执行时花的时间比没加DISTINCT更久了。

通过上述两个实验,我们可以得出这样一条结论:在重复量比较高的表中,使用DISTINCT可以有效提高查询效率,而在重复量比较低的表中,使用DISTINCT会严重降低查询效率。所以并不是所有的DISTINCT都是降低效率的,当然你得提前判断数据的重复量。

2.GROUP BY与DISTINCT去掉重复数据的对比

GROUP BY与DISTINCT类似,经常会有一些针对这两个哪个效率高的争议,今天我们就将这两个在不同重复数据量的效率作下对比。

A.重复数据量多的情况下,对UnitPrice进行去重

SELECT DISTINCT UnitPrice FROM sales.Temp_Salesorder; SELECT UnitPrice FROM sales.Temp_Salesorder GROUP BY UnitPrice;

将上述两条语句一起执行,结果如下:

可以看出两条语句对应的执行时间GROUP BY比DISTINCT效率高一点点。

B.重复数据量少的情况下,对SalesOrderDetailID进行去重

SELECT DISTINCT SalesOrderDetailID FROM sales.Temp_Salesorder SELECT SalesOrderDetailID FROM sales.Temp_Salesorder GROUP BY SalesOrderDetailID

也是同时执行上述两条语句,其结果如下:

作者对上述语句同时执行多次,针对重复量多的UnitPrice,GROUP BY总的处理效率比DISTINCT高一点点,但是针对重复量低的SalesOrderDetailID,DISTINCT就比GROUP BY快一点了,而如果随着整体数据量的增加,效果会越来越明显。

今天的内容就讲到这里,小伙伴可以动手尝试一下。如有不明白的可以在下方留言一起探讨。

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
复制
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python数据科学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聚集索引:SQL Server 进阶 Level 3
作者:David Durant,2013/01/25(首次发布于:2011/06/22) 关于系列 本文是属于Stairway系列:Stairway to SQL Server Indexes 索引是数据库设计的基础,并告诉开发人员使用数据库关于设计者的意图。不幸的是,当性能问题出现时,索引往往被添加为事后考虑。这里最后是一个简单的系列文章,应该使他们快速地使任何数据库专业人员“快速” 这个阶段的前面的层次提供了一般索引和非聚集索引的概述。它以下面关于SQL Server索引的关键概念结束。当请求到达您的数
Woodson
2018/07/19
1.2K0
SQL 优化引擎内幕
SQL Server 的优化器是基于成本计算的,高质量的执行计划来自于对成本的准确估算。而整个计划成本的估算,则是基于对每一步操作或实现操作的每个算法的开销估算。
用户1564362
2019/08/28
8820
SQL 优化引擎内幕
SQL教程:临时表
临时表与实体表类似,只是在使用过程中,临时表是存储在系统数据库tempdb中。当我们不再使用临时表的时候,临时表会自动删除。
SQL数据库开发
2024/05/10
1710
SQL教程:临时表
sql apply查询应用
这里是,先按employeeID分组再组内又按orderdate排序。用apply...top替换
Ryan_OVO
2023/10/19
1600
一文速学-零成本与数据沟通NL2SQL的概念和实现技术
关于NL2SQL的技术,如果大家最近有关注AI圈的话,或多或少都有所了解。其实很多业务场景下,于用户而言更多的是想要获取到最终数据的呈现效果,关于数据是如何获取得到的学习成本,是尽可能越少越好。众所周知当学习成本越低,那么产品的获客率也越高,当然对于我们技术人员来说,更多的还是研发思维。最终我们开发的服务主要还是为了业务服务,NL2SQL必然是以后数据开发的趋势所在,因此我们数据开发人员来说,暂且不谈掌握这门技术,清楚理念还是十分必要的。
fanstuck
2024/08/26
1.4K0
一文速学-零成本与数据沟通NL2SQL的概念和实现技术
T-SQL—理解CTEs
在推出SQLServer2005之后,微软定义了一个新的查询架构叫做公共表表达式--CTE。CTE是一个基于简单查询的临时结果集,在一个简单的插入、更新、删除或者select语句的执行范围内使用。再本篇中,我们将看到如何定义和使用CTE。 定义和使用CTE 通过使用CTE你能写和命名一个T-SQL select 语句,然后引用这个命名的语句就像使用一个表或者试图一样。 CTE下面就是定义一个CTE的语法: WITH <expression_name> (Column1, Column2, …) AS (CT
用户1217611
2018/01/30
2K0
视图
对视图创建的第一个索引必须是唯一聚集索引。创建唯一聚集索引后,可以创建更多非聚集索引。
Vincent-yuan
2020/04/30
8090
视图
sql DISTINCT去掉重复的数据统计方法
sql DISTINCT去掉重复的数据统计方法(2009-01-13 15:05:43)转载 标签:sqldistinct杂谈 分类:sql
零式的天空
2022/03/21
2.9K0
30个sql技巧
技巧: 尽量使用INNER JOIN,除非明确需要所有数据,避免使用LEFT JOIN或RIGHT JOIN。
用户11397231
2024/12/10
1410
高质量SQL书写的30条建议
本文将结合实例demo,阐述30条有关于优化SQL的建议,多数是实际开发中总结出来的,希望对大家有帮助。
Java架构师必看
2021/03/22
5250
高质量SQL书写的30条建议
SQL去重语句_sql中文
sql语句通过DISTINCT关键字去重, 用于返回唯一不同的值。DISTINCT关键字需要搭配SELECT 语句使用,语法为SELECT DISTINCT 列名称 FROM 表名称。如果指定了 SELECT DISTINCT,那么 ORDER BY 子句中的项就必须出现在选择列表中,否则会出现错误。
全栈程序员站长
2022/11/10
1.1K0
SQL高效查询建议
为什么别人的查询只要几秒,而你的查询语句少则十多秒,多则十几分钟甚至几个小时?与你的查询语句是否高效有很大关系。
SQL数据库开发
2024/04/24
1140
SQL高效查询建议
简单的语法知识
2 定义变量给变量赋值 declare @myval int; set @myval = 10; set @myval1 = @myval2*12; --下面语句是在查询中赋值变量 select @myval = max(id)+1 form mytable
liulun
2022/05/08
2280
【MySQL】基本查询(下)
什么是筛选分页结果呢,我们都知道当我们在看小说或者很长的文章的时候,都会分成很多页,在未来数据库处理当中也会面临着处理很多数据,如果直接将所有数据显示出来,会使得负载过高,所以分页或者条件筛选是避不开的话题,所以接下来我们就来学习一下什么是筛选分页结果。
用户11305458
2025/03/19
1070
【MySQL】基本查询(下)
复杂一点的查询
一:inner join inner join   是在做排除,如果任一行在两个表中不匹配,则注定将从最终的结果中排除掉 例子1:select * from employee e inner join employee m on e.managerid = m.employeeid 这是从一个表里查询了两次 得到的一行记录将包括两个employee的信息  前面的是经理  后面的是打工的 注意from哪个表  哪个表的信息就在前面 其中e和m分别是表的别名,这里的别名和列的别名不同,不用写as
liulun
2022/05/08
6150
触发器
一:什么是触发器 触发器是一种响应特定事件的特殊类型的存储过程 insert update... drop alter...等事件都有相应的触发器 二:简单的触发器 下面一个例子是在插入或者修改记录的时候的一个触发器 其中inserted表是一个临时表 存储的是将要插入的信息 这个触发器的目的是检查将要插入的信息是否符合规定 (在product表里没有特殊的记录) 这个例子是check约束所不能解决的了的
liulun
2022/05/08
1.4K0
Oracle 分页查询与数据去重深入理解
** 1.无ORDER BY排序的写法。(效率最高)  (经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!) SELECT *
星哥玩云
2022/08/18
1.1K0
数据库优化:SQL高性能优化指南,助你成就大神之路!
如果 IN 的参数是(1,2,3)这样的值列表时,没啥问题,但如果参数是子查询时,就需要注意了。比如,现在有如下两个表:
小明互联网技术分享社区
2021/06/24
8900
理解SQL原理SQL调优你必须知道的10条铁律
原文地址: http://www.nowamagic.net/librarys/veda/detail/1502 我们做软件开发的,大部分人都离不开跟数据库打交道,特别是erp开发的,跟数据库打交道更是频繁,存储过程动不动就是上千行,如果数据量大,人员流动大,那么我们还能保证下一段时间系统还能流畅的运行吗?我们还能保证下一个人能看懂我们的存储过程吗? 要知道sql语句,我想我们有必要知道sqlserver查询分析器怎么执行我么sql语句的,我么很多人会看执行计划,或者用profile来监视和调优查询语句或
Albert陈凯
2018/04/04
1.3K0
SQL Server优化之SQL语句优化
2. ON: 对vt1表应用ON筛选器只有满足 join_condition 为真的行才被插入vt2
哲洛不闹
2018/09/19
3.6K0
相关推荐
聚集索引:SQL Server 进阶 Level 3
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档