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. c++ lambda学习举例

    #include <iostream> #include<vector> #include<algorithm> #include<cmath> #in ...

  2. 到今天了你还不会集合的Stream操作吗?你要out了

    Java8的两个重大改变,一个是Lambda表达式,另一个就是本节要讲的Stream API表达式.Stream 是Java8中处理集合的关键抽象概念,它可以对集合进行非常复杂的查找.过滤.筛选等操作 ...

  3. .NET桌面程序混合开发之一:Winform+H5,WebView2概览

    1. 基于Microsoft Edge的WebView2介绍 Microsoft Edge WebView2控件可以将web技术(HTML,css,javascript)应用于原生程序中.WebVie ...

  4. LOTO示波器软件新增导览功能

    新版本的大部分型号LOTO示波器的上位机软件我们改成了导航工具条方式.原来的方式是把所有功能都显示在不同的标签页中,这样的优点是非常快捷方便,基本上用鼠标一两次点击就能直达想要的功能设置.但是缺点是不 ...

  5. 关于ThreadLocal最直白的解释

    ThreadLocal 底层原理如下: 实线是强引用,虚线是弱引用 Thread 持有 ThreadLocal 对象的引用,ThreadLocalMap 是 Thread 的成员变量,它是一个 Map ...

  6. 7.13晚考试总结(NOIP模拟14)[队长快跑·影魔·抛硬币]

    樱花满地集于我心,楪舞纷飞祈愿相随 前言 终于没有令人头疼的数学了,总感觉这次考试的题目比较良心. 尤其是对于部分分的明细就非常到位(不像上一场的凭感觉给出部分分). 这就令我这种靠部分分暴力的菜鸡选 ...

  7. OpenCV笔记(7) 轮廓

    1. 查找轮廓 FindContours public static void FindContours(InputOutputArray image, //输入8-bit单通道的图片 out Mat ...

  8. Vue渲染函数与JSX指南

    title: Vue渲染函数与JSX指南 date: 2024/6/3 下午6:43:53 updated: 2024/6/3 下午6:43:53 categories: 前端开发 tags: Vue ...

  9. Android应用程序启动流程浅析-(三万字长文慎点&Android14)

    在Android桌面Launcher源码浅析中介绍了Android的桌面程序Launcher是如何响应用户点击事件并启动App的,这篇文章继续介绍App在Android系统层是的启动流程. 一.启动流 ...

  10. DoNet Core的启动过程-WebApplicationBuilder

    1.前言 在NET6开始做ASP.NETCore的开发,我们首先要看的是启动过程,而WebApplication和WebApplicationBuilder 类是启动过程好不开的类,WebApplic ...