楼主: liliangryan

[讨论] 如何提高delete的速度?

[复制链接]
论坛徽章:
0
21#
发表于 2009-5-20 11:51 | 只看该作者
把要用的数据保存到一个表,truncate table 旧表

使用道具 举报

回复
论坛徽章:
1
2009新春纪念徽章
日期:2009-01-04 14:52:28
22#
发表于 2009-5-20 14:16 | 只看该作者
先create as再truncate吧

使用道具 举报

回复
论坛徽章:
8
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:07:24ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
23#
发表于 2009-5-20 18:42 | 只看该作者
2千万的数据删除要一个小时,有点慢,不是很清楚你的服务器,可以考虑如下:
1、看看服务器是否存在性能上的问题;
2、如果你的服务器可以,也许并行会起作用;
3、如果你的表可以,分区也许起作用,你这种在线删除的方式本身也许会产生较严重的阻塞或冲突;
4、还有,是否可以考虑insert append,然后定期维护你的表;

使用道具 举报

回复
论坛徽章:
0
24#
发表于 2009-8-19 16:44 | 只看该作者
99% 那么1%的数据 区分度很高 先找出来临时存放,
TRUNCATE 掉源表
INSERT 回去 就可以了

使用道具 举报

回复
论坛徽章:
28
ITPUB元老
日期:2005-06-18 23:14:252011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-02-18 11:42:47现任管理团队成员
日期:2011-05-07 01:45:08ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20
25#
发表于 2009-8-31 17:01 | 只看该作者
原帖由 liliangryan 于 2009-3-17 16:30 发表
很简单的一个table:两个varchar(14)的字段

每天会生成几千万条的数据,需要定期删除其中99%的数据。
从安全性的角度考虑,不能作truncate或者drop table操作。也就是说,只能delete。

为了避免undo表空间不足,现在每删100万条左右的记录后就commit一次。

现在的问题是,这样删除2千万条记录大概需要一个小时,无法满足性能的需要,请问有其他更好的解决方法么?

也可以考虑把符合条件的做个mview,原表定期做维护……

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
66
ITPUB元老
日期:2005-07-16 18:49:11授权会员
日期:2005-10-30 17:05:33ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44现任管理团队成员
日期:2011-05-07 01:45:08版主3段
日期:2012-05-15 15:24:11
26#
发表于 2009-8-31 17:18 | 只看该作者
建议重构这个表,用list partition or range partition + list partition,需要删除的数据,通过row movement进入list partition,然后直接truncate partition。

使用道具 举报

回复
论坛徽章:
0
27#
发表于 2009-8-31 20:46 | 只看该作者

回复 #1 liliangryan 的帖子

如果应用允许的话可以定期重建表,将需要的数据插入到新表,老的干掉。

使用道具 举报

回复
论坛徽章:
1
2010新春纪念徽章
日期:2010-03-01 11:08:31
28#
发表于 2009-8-31 22:33 | 只看该作者
把你要的数据ctas到临时表,删除原表。然后rename到原表

使用道具 举报

回复
论坛徽章:
176
现任管理团队成员
日期:2011-05-07 01:45:08版主7段
日期:2012-07-05 02:21:03ITPUB长老会成员
日期:2015-05-07 15:11:10ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB牛人
日期:2010-10-25 12:41:322010数据库技术大会纪念徽章
日期:2015-04-23 10:33:192011数据库大会纪念章
日期:2015-04-23 10:33:192012数据库大会纪念章
日期:2015-04-23 10:33:192013数据库大会纪念章
日期:2015-04-23 10:33:19
29#
发表于 2009-9-1 13:36 | 只看该作者
这个帖子持续了这么久,LZ不主动啊

使用道具 举报

回复
论坛徽章:
0
30#
发表于 2009-9-2 21:30 | 只看该作者
原帖由 stone_woods 于 2009-3-17 19:41 发表
delete不能按nologging方式,可以考虑create table new_tab as select ****,然后把原表rename,在把新表new_tab rename为原表名



同意,如果表上建有依赖对象的话,重建也比较轻松,还可以降低全表扫描的成本

如果表数据量过大,一个delete操作也会占用太多撤销空间啊

使用道具 举报

回复

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

本版积分规则 发表回复

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