精华内容
下载资源
问答
  • 如果一个数据表要进行删除,而数据表对应的数据量很大,对应空间,此时要进行数据表drop需要面对一些困难。首先是系统内存资源和CPU资源的使用峰值。集中进行drop操作,系统会进行数据表结构的回收,对应数据分区...

    概述

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

    如果一个数据表要进行删除,而数据表对应的数据量很大,对应空间多,此时要进行数据表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;
    1a316310bc87872c288ee5ed75d34269.png

    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;
    ccff595a061ae3867386a4cf50113ef9.png

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

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

    SQL> select header_file, header_block, blocks, bytes, extents from dba_segments where segment_name='M' and owner='SCOTT';
    bb67d7d7e55aaad2f8ee25f4db404dba.png

    通过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的语句下空间也是不回收的。

    32832b17e05bb4b37ca4aa4c8a1ad839.png
    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';
    4109ebb6a13abd0c20eec945374c879b.png

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

    5、分阶段进行空间回收

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

    5.1、第一次空间回收

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

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

    933d91a16229944da787344c8588c45e.png

    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';
    10a899668478625c56d528462c74bd95.png

    正常每个区间是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';
    cd9f7101c72d66aef47a265f2562fe5f.png

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

    5.4、删表

    SQL> drop table m;
    2e9899f1dbd9cff6219edadb4ead1c79.png

    总结

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

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

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

    后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~

    2eca3b31f81e1fdd62a86c275f298cd9.gif
    展开全文
  • oracle 多表删除 同时删除多表中关联数据 2009-04-27 14:40 1、从数据表t1中把那些id值在数据表t2里有匹配的记录全删除掉 DELETE t1 FROM t1,t2 WHERE t1.id=t2.id 或DELETE FROM t1 USING t1,t2 WHERE...
    oracle 多表删除 同时删除多表中关联数据
    2009-04-27 14:40

    1、从数据表t1中把那些id值在数据表t2里有匹配的记录全删除掉

    DELETE t1 FROM t1,t2 WHERE t1.id=t2.id 或DELETE FROM t1 USING t1,t2 WHERE t1.id=t2.id

    2、从数据表t1里在数据表t2里没有匹配的记录查找出来并删除掉

    DELETE t1 FROM t1 LEFT JOIN T2 ON t1.id=t2.id WHERE t2.id IS NULL 或

    DELETE FROM t1,USING t1 LEFT JOIN T2 ON t1.id=t2.id WHERE t2.id IS NULL

    3、从两个表中找出相同记录的数据并把两个表中的数据都删除掉

    DELETE t1,t2 from t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t1.id=25

    注意此处的delete t1,t2 from 中的t1,t2不能是别名

    如:delete t1,t2 from table_name as t1 left join table2_name as t2 on t1.id=t2.id where table_name.id=25 在数据里面执行是错误的(MYSQL 版本不小于5.0在5.0中是可以的)

    上述语句改写成

    delete table_name,table2_name from table_name as t1 left join table2_name as t2 on t1.id=t2.id where table_name.id=25 在数据里面执行是错误的(MYSQL 版本小于5.0在5.0中是可以的)

    多表连接查询很相似,不详加说明了

    展开全文
  • 场景: 开发反馈:有人删除表数据,需要进行查找who删除的? #1 根据表名称查找Object_idSQL> select object_id from dba_objects where object_name = 'OPAS_BIZ_INP_APP'#2 与开发沟通,确定大概时间范围,...

    b3fca5c58734252d7b613db24040491f.png

    场景:

    开发反馈:有人删除了表数据,需要进行查找who删除的?


    #1 根据表名称查找Object_id

    SQL> select object_id from dba_objects where object_name = 'OPAS_BIZ_INP_APP'

    #2 与开发沟通,确定大概时间范围,然后根据上面查出的object_id 进行查询

    SQL> select distinct sql_id from v$active_session_history where SAMPLE_TIME >= sysdate-1.5/24 and CURRENT_OBJ#=231752;

    #3 根据步骤2查询的sqlid,查看sql语句,找到delete语句(即可确定该sql_id)

    SQL> !ora planbyid 0w3c6v137a3wt(这个是sql_id)

    #4 确定sqlid之后,在次查询 v$active_session_history,这次查询的字段不一样。

    SQL> select machine, sample_time, program from v$active_session_history where sample_time >= sysdate-1.5/24 and sql_id = '69hdd5vhcs45x';
    展开全文
  • 如果一个数据表要进行删除,而数据表对应的数据量很大,对应空间,此时要进行数据表drop需要面对一些困难。首先是系统内存资源和CPU资源的使用峰值。集中进行drop操作,系统会进行数据表结构的回收,对应数据分区...

    概述

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

    如果一个数据表要进行删除,而数据表对应的数据量很大,对应空间多,此时要进行数据表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;
    15471d854aa7597285dc3728afcd3abb.png

    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;
    8e91d6c3e8d07ea887398f1e2dae54a7.png

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

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

    SQL> select header_file, header_block, blocks, bytes, extents from dba_segments where segment_name='M' and owner='SCOTT';
    8ebd7ce850aa73546b080665f6f1ecc3.png

    通过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的语句下空间也是不回收的。

    11becc7edf645c2b3b39ef4e2b354d9e.png
    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';
    283f862a41bc3ba4072b0b878a11b4d0.png

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

    5、分阶段进行空间回收

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

    5.1、第一次空间回收

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

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

    75f24aff3c4f865df576fbbfa1c9586c.png

    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';
    37d34cf1b3fdb7b252619ad026223aee.png

    正常每个区间是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';
    969fe1852f1617e3c90479a981f5dec4.png

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

    5.4、删表

    SQL> drop table m;
    bb606814b8cf8e71fdbf6043c51c8154.png

    总结

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

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

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

    后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~

    92200d6d45f7c9dcd5156b57254942e0.gif
    展开全文
  • oracle多表关联删除的两种方法 第一种使用exists方法 [sql]view plaincopyprint? delete fromtableA whereexits ( select1 fromtableB WheretableA.id=tableB.id ) ...
  • oracle删除表数据的两种的方式

    万次阅读 2018-09-07 08:45:44
    oracle中,truncate、delete都可以删除表数据,具体的区别以及sql语法如下: truncate table [表名]; delete from [表名]; delete与truncate的区别: delete:会产生rollback,如果删除大数据量的表速度会很慢...
  • Oracle中主从多表删除数据

    千次阅读 2012-12-28 18:32:21
    Oracle中主从多表删除数据时,必须用级联删除吗? 一个主表,带了三个从表,一一关联,A为主表 A->B->C->D 从A表中删除一条数据时,要把BCD表里相关的数据删除的话 用什么方法最好,必须用级联删除吗? --------...
  • drop table语句可以删除一个或数据表,语法规则如下: drop table 表名; drop table tb1_emp1; 删除被其他关联的主 第一步删除外键约束 alter table tb_emp drop constraints fk_emp_...
  • oracle删除数据的方法

    千次阅读 2012-04-24 14:53:45
    今天在公司中碰到访问表数据(test 表)速度非常慢,简单的一个select 语句花了10分钟, 后来查询一下表的数据量,一共有278万条数据,而且这个数据表的数据大都过期了,对于现在的业务没什么用。可悲的是这个表...
  • 项目中有一张大概有7000万条数据,造成空间已满,需要清理部分数据,打算清理3000万。 2B 做法: delete from table_name where ID > '40000000'; 备注:select count(1) fromtable_name where ID >...
  • 在实际的工作中,经常要对工作中重复的数据进行删除,如若数据行只有几条,则可通过人工查找出来,如若数据行较,这种方法就费时费力,而且容易出错,造成对表格数据的准确性和个人能力的怀疑……今天,小编给...
  • oracle和mysql多表删除数据的方法一大把,好多都是没经过...用户表users:国家表country,如图:当你看到这两张mysql表的时候,你一定认为多表数据删除的语句是这样的,其实这样是错误的!,如下。deletefromuser...
  • Oracle数据库中如何查询,删除多表关联数据要根据条件删掉一行数据(根据单号及采购组织名称) 要根据条件删掉一行数据(根据单号及采购组织名称) 例如要删这一行 :Index_number = 0000000032 先根据条件查询到这...
  • oracle快速删除表中所有数据

    千次阅读 2020-01-16 16:39:44
    -我尝试过点进里面去删,一次最多就只能删一千条,而且还要转一下圈圈,这张表里面虽然数据但是也有一万条,这样删也很浪费时间 然后,我就想到了用SQL语句来删 truncate table 表名 直接用这个删,简直比...
  • [size=24px]table1: p_auth_org 字段 org_id 主键 table2: p_auth_org_ext 字段 p_org_id 外键 ...org是主 ,org_ext 为副 怎么样同时删除, 而且要用一条语句,,,谢谢大家帮解答... 急 在线等. [/size]
  • 在实际的工作中,经常要对工作中重复的数据进行删除,如若数据行只有几条,则可通过人工查找出来,如若数据行较,这种方法就费时费力,而且容易出错,造成对表格数据的准确性和个人能力的怀疑……今天,小编给...
  • Oracle删除表中重复数据有多种方法,网上较的一种如下: delete from gljyjl jl where (jl.djbbh,jl.bgsbh) in (select djbbh,bgsbh from gljyjl group by djbbh,bgsbh having count(*) > 1) and rowid not in ...
  • oracle删除表

    2014-01-06 10:29:50
    oracle中可以使用drop、delete和truncate三个命令来删除数据库中的,网上有许多文章和教程专门讲解了它们之间的异同...2. delete可以删除整个数据也可以有选择性地删除某一条或数据,而truncate则是一次性删
  • 记一次Oracle表数据删除恢复 因为手抖没有将开发环境切换到测试环境导致在开发环境新建的表删除了,这张表包含很配置信息,而且没有备份,特此整理出恢复过程。 一、查看回收站中表 select object_name,original_...
  • 为提高系统运行效率,定时将有效期外(例如一年)的数据视为历史数据,迁移至历史空间,同时清除当前库数据,或者采用数据归档入数仓后直接删除。方案目的历史数据完整迁移正式库数据安全删除迁移所涉及可配置...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,197
精华内容 478
关键字:

oracle删除多表数据