对于上千万甚至上亿的数据,如何正确的删除?

【原创】 波波说运维 2019-06-22 00:01:00

概述

当我们的系统进入海量数据时代后,很多过去看起来轻松简单的事情就变得比较复杂。此时,就需要我们采取一些独特的技术和技巧,来避免因此带来的一些问题。

如果一个数据表要进行删除,而数据表对应的数据量很大,对应空间多,此时要进行数据表drop需要面对一些困难。

首先是系统内存资源和CPU资源的使用峰值。集中进行drop操作,系统会进行数据表结构的回收,对应数据分区和数据块的回收。当数据表很大的时候,这个过程自然很长,对CPU来说消耗时间和数量都很大。同时,进行drop table的过程中,会将数据表转移到临时段进行处理,这个过程对临时段空间的消耗也是巨大的。

第二个是一个重要问题,就是对整体前端应用的影响。如果贸然进行drop操作,给业务系统造成影响,进而带来影响。如果借用业务系统窗口期进行删除操作,又不能保证窗口期够用。

下面介绍一下对于海量数据表的标准删除方案。


分步分阶段大表删除

总的指导原则是先删除数据,不影响数据一致性的要求,之后分阶段分步骤的进行空间回收。避免一次性drop对系统造成过大的压力。

步骤:

1、首先使用带reuse storage子句的truncate table,将数据删除。

reuse storage子句的作用是单纯降低数据段data segment的高水位线,对分配的空间不进行回收。这样truncate操作不涉及到空间回收,速度是可以接受的。

2、分若干次数,使用deallocate unused keep XXX的方法,将分配的空间回收。

因为keep后面可以加入维持空间数量,所以可以分若干个窗口期进行回收。


实验演示

1、准备实验环境。

SQL> select * from v$version;

2、准备20万的数据

远谈不上海量,这里主要做实例演示。

SQL> create table m as select * from dba_tables;
SQL> insert into m select * from m;
SQL> /
SQL> /
SQL> /
SQL> /
SQL> select count(*) from m;

3、分析数据表M的相关参数信息

此时,我们分析作为一个data segment,数据表M的相关参数信息。

SQL> select header_file, header_block, blocks, bytes, extents from dba_segments where segment_name=‘M‘ and owner=‘SCOTT‘;

通过dba_segments视图可以知道,数据表M共分配在81个分区上,共包括10240个数据块。空间占有为80M左右。

4、删除实验

首先使用truncate table。

SQL> truncate table m reuse storage;
Executed in 0.52 seconds (假数据)

reuse storage子句下,空间是不进行回收的,所以相对速度较快。下面是一个对比同类型规模数据表实验。

SQL> create table md as select * from m;
SQL> select count(*) from md;
SQL> truncate table md;
Executed in 0.901 seconds (假数据)

相同的数据结构和数据量,使用的时间要超过reuse storage的方式。当然,带有reuse storage的语句下空间也是不回收的。

SQL> exec dbms_stats.gather_table_stats(‘SCOTT‘,‘M‘,cascade => true);
SQL> select header_file, header_block, blocks, bytes, extents from dba_segments where segment_name=‘M‘ and wner=‘SCOTT‘;

这里可以发现,虽然数据被删除了,但是空间没有回收。在dba_segments上,依然显示81个数据区的空间分配。

5、分阶段进行空间回收

让回收工作在受控范围下进行。

5.1、第一次空间回收

SQL> alter table m deallocate unused keep 20M; --控制在20M
SQL> select header_file, header_block, blocks, bytes, extents from dba_segments where segment_name=‘M‘ and owner=‘SCOTT‘;

可见,分区为36个,将空间近似降低到21M左右。此后,可以在不同的窗口期中,根据自身情况不断进行回收空间工作。

5.2、多次空间回收

SQL> alter table m deallocate unused keep 15M;
SQL> alter table m deallocate unused keep 10M;
SQL> alter table m deallocate unused keep 3M;
SQL> alter table m deallocate unused keep 100k;
SQL> select header_file, header_block, blocks, bytes, extents from dba_segments where segment_name=‘M‘ and owner=‘SCOTT‘;

正常每个区间是64KB,100K需要2个分区。

5.3、尝试回收到1k

SQL> alter table m deallocate unused keep 1k;
SQL> select header_file, header_block, blocks, bytes, extents from dba_segments where segment_name=‘M‘ and owner=‘SCOTT‘;

这里虽然没有回收到1k,但也是已经到一个分区八个数据块的程度。最后就直接drop table即可。

5.4、删表

SQL> drop table m;


总结

1、在写一句SQL的时候,一定要注意操作数据集合、对象的范围。对于可能存在的海量数据访问,一定要实现有准备,事后有监控。这样才能保证系统可用性以及上线成功率;

2、海量数据处理的一个方法就是分割,根据业务的限制和要求,在时间上进行分割。处理原则是避开业务系统繁忙时间段,尽量将高负载工作进行划分实现;

3、drop数据表的方法。一般来说,进行drop数据表是不能中间终止的。drop数据表时,oracle首先把数据段转化为临时段对象,之后开始不断的进行空间回收。即使这个过程中间停止(强制终止),再次启动的时候smon进行恢复,也会进行回收删除操作。所以,对数据表进行直接drop的时候,切记三思。

原文地址:https://www.cnblogs.com/lcword/p/11553125.html

时间: 2024-10-01 07:11:41

对于上千万甚至上亿的数据,如何正确的删除?的相关文章

上千万或上亿数据(有重复),统计其中出现次数最多的N个数据. C++实现

上千万或上亿的数据,现在的机器的内存应该能存下.所以考虑采用hash_map/搜索二叉树/红黑树等来进行统计次数.然后就是取出前N个出现次数最多的数据了,可以用第2题提到的堆机制完成. #include "IOSTREAM" #include<hash_map> #include<string> #include<map> using namespace std; int main(void) { //海量待统计数据 char* a[5]={&quo

上千万或上亿数据(有反复),统计当中出现次数最多的N个数据. C++实现

上千万或上亿的数据,如今的机器的内存应该能存下.所以考虑採用hash_map/搜索二叉树/红黑树等来进行统计次数. 然后就是取出前N个出现次数最多的数据了,能够用第2题提到的堆机制完毕. #include "IOSTREAM" #include<hash_map> #include<string> #include<map> using namespace std; int main(void) { //海量待统计数据 char* a[5]={&qu

继上一篇Django的数据库数据的编辑和删除

继上一篇Django的数据库数据的编辑和删除 首先需要写一个能够展示数据库一张表中所有数据的 html 页面 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jq

ionic上拉加载更多当数据加载完没有下一页的时候我们需要显示一下&quot;没有更多了&quot;的友好提示

ionic上拉加载更多当数据加载完没有下一页的时候我们需要显示一下"没有更多了"的友好提示,但是在ionic里面遇到了一个问题.就是没有数据的时候我显示了没有更多的时候我的点击商品详情的事件失效了.怎么点都不触发 这到底怎么回事.简直是....遇到了各种奇葩问题.好了先不吐槽了.还是先解决问题吧. 我们看代码的时候很容易从因为这句话而出发.最开始的时候我是上拉第一页的时候.点击事件还有效.也就是上拉到最后一页点击事件才会失效.也就是isNext为false的时候.这时候我就会以为是ng

人口上千万,石家庄干洗行么发展

作为河北省的省城,石家庄干洗作为省内干洗行业的领军队伍,其发展速度相当之快.在整个干洗行业前景大好的时候,各大品牌也都看到了石家庄的秀色可餐.洁希亚国际洗衣在认定石家庄有巨大潜力的同时,已经展开了攻势. 据相关数据显示,石家庄市2015年底常驻人口已上千万,且每一年呈加速上升趋势,高速的人口增长为石家庄干洗行业的未来打响了信号枪.洁希亚带着浩瀚的品牌军也开始入驻,目前石家庄干洗发展空间巨大,洁希亚凭借其优秀的品牌影响力呼吁创业人士,全市干洗店铺悄然陡增. 洁希亚干洗国内知名十大洗衣品牌之一,在市

史上最全解析!大数据在十大行业的应用

什么是大数据?这次我们不谈概念,不谈理论,避虚就实,关注大数据在十大行业的实际应用.从证券行业到医疗领域,越来越多公司意识到大数据的重要性.2015年Gartner调查显示,超过75%的公司正在投资或计划在未来两年内投资大数据.而在2012年进行的类似调查中,仅有58%的公司在未来两年内计划投资大数据.增强客户体验.降低成本.精准营销以及提高流程效率.数据安全是公司关注大数据的主要目的.本文将研究正在使用大数据的10个垂直行业及面临的挑战,以及大数据如何解决这些难题. 1. 银行和证券挑战:通过

轻松上云系列之一:本地数据迁移上云

背景信息在云计算服务高速发展的今天,如何方便快捷地将已有的服务器系统迁移上云,有着非常重要的意义.阿里云服务器迁移服务方案,即迁移服务,正是在这个需求背景下应运而生.它极大地简化了服务器系统迁移工具的使用条件.降低了使用成本,使用户的系统一键迁移到阿里云成为可能. 使用迁移服务来进行系统迁移比较便捷,您可以先参考迁云工具帮助文档了解使用条件及基本操作. 迁移流程1.熟悉迁移工具使用方法,提前做好测试演练. 2.评估迁移时间/成本,制定迁移计划. 3.正式迁移,可咨询阿里云团队支持. 数据传输服务

解决Mysql 主键id是UUID的上一页下一页数据翻页,附带SQL

解决id为UUID的上一页下一页数据翻页,把base_course_timetable表换成自己的表就可以了 SELECTbef.* FROM(SELECTt.rownum,t.id FROM( SELECT @rownum := @rownum + 1 AS rownum, base_course_timetable.* FROM ( SELECT @rownum := 0 ) r, base_course_timetable ) t WHEREt.rownum < (SELECTw.rown

使用Python Pandas处理亿级数据

在数据分析领域,最热门的莫过于Python和R语言,此前有一篇文章<别老扯什么Hadoop了,你的数据根本不够大>指出:只有在超过5TB数据量的规模下,Hadoop才是一个合理的技术选择.这次拿到近亿条日志数据,千万级数据已经是关系型数据库的查询分析瓶颈,之前使用过Hadoop对大量文本进行分类,这次决定采用Python来处理数据: 硬件环境 CPU:3.5 GHz Intel Core i7 内存:32 GB HDDR 3 1600 MHz 硬盘:3 TB Fusion Drive 数据分析