查看: 11845|回复: 12

[SQL] 大数据量去重问题如何解决?

[复制链接]
论坛徽章:
1
优秀写手
日期:2014-07-22 06:00:13
跳转到指定楼层
1#
发表于 2014-11-10 14:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 冷月宫主 于 2014-11-10 15:03 编辑

我有一个表,这个表每天有30-40万条数据,但是可能有一些重复的记录(仅部分字段),我现在要去掉这些重复的记录,应该如何处理?
要求:
1、这个记录就是一个ID不同,其它都相同
2、去除重复的不是把所有的有重复的记录都去掉,而是把重复的记录变为一条

要考虑性能和效率的问题。

请大家给个意见或思路!谢谢

论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
2#
发表于 2014-11-11 07:31 | 只看该作者
CREATE TABLE AS SELECT ...
然后创建唯一约束。

使用道具 举报

回复
论坛徽章:
22
ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:00马上加薪
日期:2014-10-21 18:48:25马上加薪
日期:2014-10-21 18:48:312015年新春福章
日期:2015-03-04 14:53:162015年新春福章
日期:2015-03-06 11:58:39沸羊羊
日期:2015-06-11 17:08:14巨蟹座
日期:2015-07-10 09:11:44天枰座
日期:2016-01-18 10:58:39秀才
日期:2016-02-18 10:08:14秀才
日期:2016-06-23 14:15:06
3#
发表于 2014-11-11 10:02 | 只看该作者
这是一个设计的问题,为什么有重复的数据,事后用技术处理是下下策

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
8
优秀写手
日期:2014-10-15 06:00:14马上有房
日期:2014-11-12 15:19:532015年新春福章
日期:2015-03-04 14:55:132015年新春福章
日期:2015-03-06 11:59:47喜羊羊
日期:2015-03-16 11:00:26秀才
日期:2015-08-03 12:41:59秀才
日期:2016-01-13 12:14:26秀才
日期:2016-02-18 10:08:14
4#
发表于 2014-12-8 11:22 | 只看该作者
stevendba 发表于 2014-11-11 10:02
这是一个设计的问题,为什么有重复的数据,事后用技术处理是下下策

设计出什么问题了

使用道具 举报

回复
论坛徽章:
22
ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:00马上加薪
日期:2014-10-21 18:48:25马上加薪
日期:2014-10-21 18:48:312015年新春福章
日期:2015-03-04 14:53:162015年新春福章
日期:2015-03-06 11:58:39沸羊羊
日期:2015-06-11 17:08:14巨蟹座
日期:2015-07-10 09:11:44天枰座
日期:2016-01-18 10:58:39秀才
日期:2016-02-18 10:08:14秀才
日期:2016-06-23 14:15:06
5#
发表于 2014-12-8 11:38 | 只看该作者
dbcloudy 发表于 2014-12-8 11:22
设计出什么问题了

这个记录就是一个ID不同,其它都相同
   --这个说明主键没有用

使用道具 举报

回复
论坛徽章:
3
优秀写手
日期:2014-12-25 06:00:032015年新春福章
日期:2015-03-04 14:51:122015年新春福章
日期:2015-03-06 11:57:31
6#
发表于 2014-12-8 17:34 | 只看该作者
建议用分区表,按日分区,每天的数据只有30~40万,再按分区去重。每个分区按所有列(除)ID外分组取最小的ID,把得到的数据insert到一张新建的表中,再删除原表分区的数据(truncate 分区),再重新插回来分区即可。

使用道具 举报

回复
论坛徽章:
4
2014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02马上有对象
日期:2014-02-20 19:18:44秀才
日期:2015-11-11 10:07:14
7#
发表于 2014-12-8 17:48 | 只看该作者
试试这样:
  1. create table t_new
  2. select min(id) as id,
  3.        a1,a2,a3
  4. from t
  5. group by a1,a2,a3


  6. rename t to t_old

  7. rename t_new to t
复制代码
最后 重新创建一些索引等

使用道具 举报

回复
论坛徽章:
0
8#
发表于 2014-12-8 20:52 | 只看该作者
gulunhua 发表于 2014-12-8 17:48
试试这样:最后 重新创建一些索引等

建立一个job每天执行一次,用一小段存储过程去删除当天的重复数据。

使用道具 举报

回复
求职 : ERP实施
论坛徽章:
22
2013年新春福章
日期:2013-02-25 14:51:24秀才
日期:2017-02-22 15:18:00秀才
日期:2017-03-20 13:42:20秀才
日期:2017-03-28 15:59:38秀才
日期:2017-05-09 11:37:55秀才
日期:2017-08-18 11:02:47秀才
日期:2018-04-08 14:48:31秀才
日期:2018-06-21 10:08:00ITPUB18周年纪念章
日期:2018-09-17 10:09:49ITPUB18周年纪念章
日期:2018-09-17 10:12:57
9#
发表于 2014-12-9 10:12 | 只看该作者
建议考虑录入的时候做控制。重复的数据就不要保存进数据库。
至于之前的数据整理,就不用考虑性能和效率的问题了。处理掉就好。

使用道具 举报

回复
求职 : 数据库开发
论坛徽章:
29
ITPUB学员
日期:2009-10-14 18:49:45至尊黑钻
日期:2015-12-31 11:11:56数据库板块每日发贴之星
日期:2009-10-22 01:01:02优秀写手
日期:2014-04-30 06:00:17ITPUB8周年纪念徽章
日期:2009-10-09 21:30:10秀才
日期:2017-05-17 11:39:09马上有车
日期:2014-10-09 10:14:53马上有钱
日期:2014-02-18 16:43:09路虎
日期:2013-10-15 15:38:59林肯
日期:2013-09-12 15:57:33
10#
发表于 2014-12-9 10:46 | 只看该作者
30-40万算不上多大的数据量,只要在它们进入目的表之前处理好就行,在入表之前先插入临时表,然后去重,方法很多,7楼那个就是一种。。不用太考虑效率问题,40W并不算多,而且每天一次

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表