By:授客 QQ:1033553122

删除表数据操作

清空所有表记录

TRUNCATE TABLE your_table_name;

或者批量删除满足条件的表记录

BEGIN
LOOP
DELETE FROM your_table_name WHERE rownum <= 50000;
EXIT WHEN SQL%ROWCOUNT = 0;
COMMIT;
END LOOP;
END;

释放表空间

存放大数据量的表,其表空间占用也比较大,删除数据后并不会自动释放这些记录占用的表空间,所以,即便表里面数据量很少,查询效率依旧很慢,所以,需要释放表空间。

-- 查询数据表占用的表空间大小
SELECT sum(bytes)/(1024*1024) FROM user_segments WHERE segment_name='YOUR_TABLE_NAME'; --注意,表名必须大写

说明:sum(bytes)/(1024*1024) 数据统计单位由Byte转为GB

--整理碎片,释放已删除记录占用的表空间
ALTER TABLE your_table_name MOVE;

重建索引

释放了表空间以后表的ROWID会发生变化,基于ROWID的索引会失效,此时就需要重建索引

--重建非分区索引
ALTER TABLE your_table_index REBUILD [ONLINE] [NOLOGGING]; --重建分区索引
--针对分区索引-非组合索引
ALTER INDEX your_table_index REBUILD PARTITION your_partition_name [ONLINE] [NOLOGGING];

注意:

  • 设置日志级别为NOLOGGING 意味尽量减少日志,可以加速索引重建

  • ONLINENOLOGGING 两者位置顺序可以对调,不影响

  • 普通情况下建立索引或者REBUILD索引时,oracle会对基表加共享锁,在这期间,无法对表进行DML操作。如果希望避免这种情况,需要加ONLINE选项

  • 对索引进行REBUILD时,如果不加ONLINE选项,则Oracle直接读取原索引的数据,否则直接扫描表中的数据 ,索引在重建时,查询仍然可以使用旧索引。实际上,Oracle在REBUILD索引的过程中,并不会删除旧索引,直到新索引重建成功,这就是相对删除索引然后重建索引的一个好处:不会影响原有的SQL查询。但也正由于此,用REBUILD方式建立索引需要相应表空间的空闲空间是删除重建方式的2倍。

  • 不能直接REBUILD整个分区索引

    • 对于非组合索引,需要REBUILD每个分区(partition)

    • 对于组合索引,需要REBUILD每个子分区(subpartition)

    • 分区、子分区较多的情况下,可以使用下面的SQL可以生成相应的REBUILD语句

      --重建分区索引-非组合索引
      SELECT 'ALTER INDEX ' || index_owner || '.' ||index_name ||' REBUILD PARTITION ' || partition_name || ' NOLOGGING;'
      FROM dba_ind_partitions
      WHERE index_owner = 'INDEX_OWNER_NAME' --可选查询条件,注意,如果指定该条件,索引拥有者必须大写
      AND index_name = 'YOUR_INDEX_NAME'; --注意,索引名称必须大写 --重建分区索引-组合索引
      SELECT 'ALTER INDEX ' || index_owner || '.' ||index_name ||' REBUILD SUBPARTITION ' || subpartition_name || ' NOLOGGING;'
      FROM dba_ind_subpartitions
      WHERE index_owner = 'INDEX_OWNER_NAME' --可选查询条件,注意,如果指定该条件,索引拥有者必须大写
      AND index_name = 'YOUR_INDEX_NAME'; --注意,索引名称必须大写
  • 针对非分区索引,如果清理的表比较多,或者不知道被清理的表拥有哪些索引,可以使用以下SQL查询并生成对应的重建索引SQL

    SELECT concat(concat('ALTER INDEX ', INDEX_NAME), ' REBUILD;')
    FROM all_indexes
    WHERE owner='INDEX_OWNER_NAME' --可选查询条件,注意,如果指定该条件,索引拥有者必须大写
    AND table_name IN('TABLE_NAME1 ','TABLE_NAME2', '...', 'TABLE_NAMEN')--注意,表名必须大写

分析表

分析表,是为了使基于CBO的执行计划更加准确,在一定程度上能带来一些性能提升

ANALYZE TABLE table_name COMPUTE STATISTICS;

--等价于
ANALYZE TABLE table_name COMPUTE STATISTICS FOR TABLE FOR ALL INDEXES FOR ALL COLUMNS;

说明:生成的统计信息的存放位置:

  • FOR TABLE的统计信息存在于视图:USER_TABLESALL_TABLESDBA_TABLES
  • FOR ALL INDEXES的统计信息存在于视图: USER_INDEXESALL_INDEXESDBA_INDEXES
  • FOR ALL COLUMNS的统计信息存在于试图:USER_TAB_COLUMNSALL_TAB_COLUMNSDBA_TAB_COLUMNS

Oracle 删除大量表记录操作总结的更多相关文章

  1. --oracle删除数据库表(无主键)中重复的记录

    --oracle删除数据库表(无主键)中重复的记录 1,  CREATE TABLE newtable as SELECT distinct * FROM T_SYSTEM_MENU_PRIV; 2, ...

  2. MySQL数据库(3)_MySQL数据库表记录操作语句

    附: MYSQL5.7版本sql_mode=only_full_group_by问题 .查询当前sql_mode: select @@sql_mode .查询出来的值为: set @@sql_mode ...

  3. mysql支持跨表delete删除多表记录

    前几天写了Mysql跨表更新的一篇总结,今天我们看下跨表删除. 在Mysql4.0之后,mysql开始支持跨表delete. Mysql可以在一个sql语句中同时删除多表记录,也可以根据多个表之间的关 ...

  4. 巧用*_his表记录操作历史

    文章转载自「开发者圆桌」一个关于开发者入门.进阶.踩坑的微信公众号 许多OLTP应用的开发者都知道,一些重要的操作要记录操作历史,把操作前的数据备份到历史表,然后再执行相应的修改操作.这样可以获取某个 ...

  5. oracle用户与表空间操作

    oracle系统用户sys,system , sysman, scott 使用system用户登录[username/password][@server][as sysdba|sysoper]eg: ...

  6. 卸载oracle删除注册表脚本

    一.前言 在我们操作系统中,有时要卸载oracle数据库,每一次都要去删除win下的注册表,为了方便删除注册表的信息,下面通过一种删除注册表快捷的脚本. 二.脚本信息 Windows Registry ...

  7. oracle删除users表空间

    1.users表空间一般情况下是默认的,需将别的空间设置成默认,再删除users表空间(oracle不允许删除默认空间的). 2.删除表空间的同时会报这样的错:ORA-22868错误.原因:推断应该存 ...

  8. 在EntityFramework(EF)中删除主从表记录

    删除主表:  如果要删除单个的Book对象,由于启用了级联删除,干掉一个Book,它所关联的所有BookReview也一并删除了. (说的简单,如果用Attach方法或者Remove,加修改删除状态, ...

  9. oracle多表关联删除数据表记录方法

    oracle多表关联删除的两种方法 第一种使用exists方法 delete from tableA where exits ( select 1 from tableB Where tableA.i ...

  10. Oracle删除重复数据记录

    删除重复记录,利用ROWID 和MIN(或MAX)函数, ROWID在整个数据库中是唯一的,由Oracle自己产生和维护,并唯一标识一行(无论该表中是否有主键和唯一性约束),ROWID确定了每条记录在 ...

随机推荐

  1. 原型工具--canva可画

    Canva 是一个功能强大的在线设计平台,提供了丰富的设计工具和素材,包括原型设计.尽管 Canva 在原型设计方面并不像专门的原型设计工具(如Sketch.Figma.Adobe XD等)那样功能全 ...

  2. 莫烦pytorch学习记录

    感谢莫烦大神Pytorch B站视频:https://www.bilibili.com/video/av15997678?p=11 一个博主的笔记:https://blog.csdn.net/Will ...

  3. iOS MonkeyDev 尝试体验(非越狱开发)

    一.前言 随着iOS系统的逐渐开放,iOS越狱需求的人越来越少,那么在非越狱系统上面开发越狱插件那将是一个不错的选择,在github上面发现一个开源的Xcode工程模板. 整合了越狱开发的工具.重签名 ...

  4. 【论文笔记】R-CNN系列之论文理解

    [深度学习]总目录 RCNN全称region with CNN features,即用CNN提取出Region Proposals中的featues.RCNN系列论文(R-CNN,Fast R-CNN ...

  5. itest(爱测试) 开源接口测试,敏捷测试管理平台10.1.4发布

    一:itest work 简介 itest work 开源敏捷测试管理,包含极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试,接口Mock,还有压测 ,又有丰富的统计分析,8合1工作站.可按 ...

  6. scala的基本语法

    区分常量和变量 常量 变量 写一行代码,写多行代码,终端代码 数据类型 byte char short int long float double boolean  数据类型与java相似,但与jav ...

  7. (C#) IIS 响应标头过滤敏感信息(如:Server/X-Powered-By等) 运维知识

    背景: 再一次净网行动中,客户要求安全改造发现了接口请求的header标头中出现如图中的敏感信息. 说明: 其意义在于告知浏网站是用什么语言或者框架编写的.解决办法就是修改该响应头为一个错误的值,将攻 ...

  8. jquery的筛选器

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8 ...

  9. RSA算法中,为什么需要的是两个素数?

    PrimiHub一款由密码学专家团队打造的开源隐私计算平台,专注于分享数据安全.密码学.联邦学习.同态加密等隐私计算领域的技术和内容. RSA算法中,为什么需要的是两个素数? RSA算法是一种广泛使用 ...

  10. docker容器单机编排

    随着网站架构的升级,容器也使用的越发频繁,应用服务和容器间的关系也越发复杂. 这就要求研发人员能够更好的方法去管理数量较多的容器服务,而不能手动的去挨个管理. 例如一个LNMP的架构,就得部署web服 ...