免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9221 | 回复: 11
打印 上一主题 下一主题

[数据库] 大数据量清理办法求助,3800W数据。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-30 11:40 |只看该作者 |倒序浏览
ORACLE 版本:10

正式环境大概有一张3800W条记录的表,占用空间11G左右,按时间字段删除其中大概1800W条记录,而且时间字段无索引,表无分区,正式环境的表实时在用,不能DROP,如何快速清理?


已经尝试的办法:

1)delete from where rownum < 10100;分批清楚,表空间不释放,需要手工缩表,速度很慢。

2) truncate 正式环境的表实时在用,不能truncate

3) drop 正式环境的表实时在用,不能DROP


求高手。

论坛徽章:
7
天蝎座
日期:2013-08-16 23:19:32丑牛
日期:2014-01-08 09:20:14寅虎
日期:2014-01-11 11:03:44午马
日期:2014-04-28 11:02:40天秤座
日期:2014-05-16 23:24:24摩羯座
日期:2014-07-20 10:46:04卯兔
日期:2014-08-08 15:21:41
2 [报告]
发表于 2013-10-03 21:28 |只看该作者
创建分区表,然后在删除吧

论坛徽章:
0
3 [报告]
发表于 2013-10-14 15:33 |只看该作者
按时间字段建立分区表 , 删除数据的时候直接TRUNCATE分区就可以了, 重建表吧。

论坛徽章:
3
CU大牛徽章
日期:2013-09-18 15:16:55CU大牛徽章
日期:2013-09-18 15:18:22CU大牛徽章
日期:2013-09-18 15:18:43
4 [报告]
发表于 2013-10-14 16:14 |只看该作者
在业务正在进行的情况下,删除大量数据,确实需要谋定而后动!

对于楼主这种情况,其实还需要搞清楚几个问题,才能制定出合理的方案:

1、删除数据是一次性操作还是以后会经常删,这个需要明确?

2、进行空间回收能不能停机,这都是需要考虑的?


如果是一次性操作的话,可以考虑以下步骤:

1、先在时间字段上创建索引,对于3800万条记录,应该很快;

2、利用ctas创建与原来一样的表,where给定条件是留下的记录;

3、删除原来的表;

4、将新创建的表名rename为原来的,这里需要考虑约束和索引!

或者可以delete  然后收缩空间!

如果是常规性操作的话,那就需要创建索引,然后创建分区表,将来删除分区即可!

论坛徽章:
0
5 [报告]
发表于 2013-10-22 16:44 |只看该作者
收缩空间速度会很慢,时间很长

论坛徽章:
2
酉鸡
日期:2014-02-19 09:11:08摩羯座
日期:2014-05-23 10:16:16
6 [报告]
发表于 2013-10-22 17:47 |只看该作者
你这个最好建立分区表,但现在要删除
你一次删除1800W很慢,但一次删除1000,1W应该很快的
给你个存储过程,自己改下,我几亿的数据都是用这个删的

  1. CREATE OR REPLACE PROCEDURE "P_DELETE_SESSIOIN" (P_OUT_SQLCODE OUT VARCHAR2, P_OUT_ERRMSG  OUT VARCHAR2) AS
  2.   pragma autonomous_transaction;
  3.   V_NAME VARCHAR(100) := 'P_DELETE_SESSIOIN';
  4.   V_START DATE;
  5.   ROWNUM        NUMBER(10):=0;
  6.   V_ROW_COUNT   NUMBER(10):=0;
  7.   n_delete number:=0;
  8. --  p_TableName VARCHAR2(20):=ODS_TBL_SESSION;
  9. --  p_Condition VARCHAR2(40) :=CREATETIME<TRUNC(SYSDATE);
  10.   p_Count     VARCHAR2(20):='20000';

  11. BEGIN
  12. P_OUT_SQLCODE :='0';
  13. P_OUT_ERRMSG  :='OK';
  14. V_START    := SYSDATE;
  15.    while 1=1 loop
  16.      EXECUTE IMMEDIATE
  17.      --这里一次删除2W条
  18.        'delete from ODS_TBL_SESSION where CREATETIME<TRUNC(SYSDATE)'||' and rownum <= :rn' USING p_Count;
  19.      if SQL%NOTFOUND then
  20.      exit;
  21.      else
  22.           n_delete:=n_delete + SQL%ROWCOUNT;
  23.      end if;
  24.      commit;
  25.    end loop;
  26.    commit;
  27.    DBMS_OUTPUT.PUT_LINE('Finished!');
  28.    DBMS_OUTPUT.PUT_LINE('Totally '||to_char(n_delete)||' records deleted!');
  29.   V_ROW_COUNT:=n_delete;
  30.   ROWNUM :=ROWNUM+V_ROW_COUNT;
  31. EXCEPTION
  32.   WHEN OTHERS THEN
  33.     P_OUT_SQLCODE :=SQLCODE;
  34.     P_OUT_ERRMSG  :='FAILED';
  35.     ROLLBACK;
  36. END P_DELETE_SESSIOIN;

复制代码

论坛徽章:
5
荣誉会员
日期:2011-11-23 16:44:17CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-09-18 15:15:45未羊
日期:2014-02-25 14:37:19射手座
日期:2014-12-26 22:55:37
7 [报告]
发表于 2013-10-23 17:24 |只看该作者
alter session force parallel ddl parallel 8;
create newtab as select * from oldtab where <要保留数据的过滤条件>;
rename oldtab to oldtabbak;
rename newtab to oldtab;

论坛徽章:
2
酉鸡
日期:2014-02-19 09:11:08摩羯座
日期:2014-05-23 10:16:16
8 [报告]
发表于 2013-10-24 11:05 |只看该作者
楼上的是个好办法,这样rename表速度也很快,基本对线上没什么影响回复 7# wolfop


   

论坛徽章:
7
亥猪
日期:2013-10-10 17:00:29辰龙
日期:2013-10-12 16:23:19卯兔
日期:2013-11-18 17:01:27金牛座
日期:2014-09-09 10:17:052015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之柏太阳神
日期:2015-09-25 13:56:42数据库技术版块每日发帖之星
日期:2016-08-06 06:20:00
9 [报告]
发表于 2013-11-08 16:55 |只看该作者
我提供一个思路
1. 创建一个分区表跟原表一个的结构;以你要保留的时间为分割点;
2.交互分区一次;这时候原表没数据了;数据在分区表中;在turncate 子分区表;
3.在交换分区一次;就可以达到效果

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
10 [报告]
发表于 2013-11-08 17:11 |只看该作者
大数据表必定要使用分区表。否则只是等死。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP