日期:2014-05-17  浏览次数:20436 次

如何将一个记录过亿的表,手工拆分成两个表。
我的数据库中一个表(kcjhgl)记录已经超过1个亿,我计划将其中没用的历史记录复制到另一个表中,然后删除。但一操作服务器便像死了一样,害得我只能中止。

请教如何能快速的将不要的数据复制到另一个表,然后删除?
谢谢!

------解决方案--------------------
备分,
如果有用的数据少一些,就选有用的数据插到一个新表中,把以前那张表truncate掉,或者删除新建一张表吧
再从备分里慢慢转移吧.

感觉还是很坑,你不会是在线的时候操作吧.
------解决方案--------------------
如果不是在線生產庫好辦一點,通過備份然後truncate table


如果是在線,寫個腳本批量刪除,一次就刪除2W左右,刪除會造成大量碎片,要重建
------解决方案--------------------
引用:
我试过,一个夜晚还复制不完,数据库像死了一样。只能有一个夜晚的时间,第二天还要出库


那修改表名 ,然後將2013的複製到新表行嗎?
------解决方案--------------------
引用:
select * into KCJHGL_201312 FROM KCJHGL 
WHERE KCJHGL_KJND<='2013'  and kcjhgl_sl=0

我是将2013年以前,数量为0的数据都清除掉


别这么弄。

你说你有用的数据少,没有的数据多,那就把有用的数据,select into 到一个新的表,然后把原来的表直接:

truncate table 表名

然后,在把新表的数据 insert into 表名

这样,应该是很快的
------解决方案--------------------
可以离线,可以分别把数据insert到2个表,然后改表名

如果还慢,则也需要与在线一样,小步快跑:循环执行,每次只处理一小部分(如1万或1千行)
------解决方案--------------------
分两种处理方法:
1.如果周末有大段的时间(超过24小时)停系统让你导表,那就事先写好脚本做好通知周末跑。一般来说是能跑完的。
2.如果一直没有大段时间,分批将旧数据插入一个表,将大部分新数据插入另一个表,然后找一个时间点(比如半夜),停掉录入,把增量的新数据补到第二张新表中,改旧表名为BAK,新增的第二张表改为新表名,赋权语句提前写好,这时运行,然后开系统测试一下,没问题了就把改名的旧表TRUNCATE掉,再收缩一下数据库,就好了。
------解决方案--------------------
你的表没有时间标识?或者怎么去判断没用?比如我最近也在搞类似的,但是有时间列,我就每个季度或者每个月地移除。这样基本上不会产生什么问题
------解决方案--------------------
或者,我觉得你可以把你的表改成分区表,按照日期字段来分区,到时候不需要某个月的数据,直接swith切换分区,然后删除就可以,速度非常快
------解决方案--------------------
一亿的数据移动很消耗资源,可以用分区(2005以上,企业版),或者其他技术来移